Skip to content

Win32API

リファレンス

Windows API List - MSDN

詳細な Windows API 一覧 (英語) - '''Windows API リスト: Windows API、Win32 API、Win32API | MSDN''' - このページではよく使われる一部の Windows API をリストし、日本語ドキュメントと英語ドキュメントへのリンクを案内しています。

pinvoke.net: the interop wiki!

DLLの一覧と説明

標準 Windows API

C言語での解説

RubyでWin32APIを使う

【公式】Ruby 2.0.0 リファレンスマニュアル - class Win32API

使用例、引数の説明。

api = Win32API.new(dllname, func, import, export)
api.call(args)

DLとWin32APIとFiddle - mirichiの日記

Ruby1.8時代、Ruby1.9時代、Ruby2.0時代

Ruby 1.9.0 problem with DL.dlopen - Ruby Forum

1.9's dl is not compatible with 1.8's. The following code may help you:

require 'dl'
user32 = DL.dlopen('user32')
msgbox = DL::CFunc.new(user32['MessageBoxA'], DL::TYPE_LONG, 'MessageBox')
msgbox.call(["Hello", "Message Box", 0](0,).pack('L!ppL!').unpack('L!*'))

instance method Array#pack

Array#pack、String#unpack のテンプレート文字の一覧です。テンプレート文字は後に「長さ」を表す数字 を続けることができます。「長さ」の代わりに`*'とすることで「残り全て」 を表すこともできます。

class DL::CFunc

DL::CFunc.new(addr, type = DL::TYPE_VOID, name = '', calltype = :cdecl)

Ruby 1.9.3 リファレンスマニュアル dl/importライブラリ

library dl/import

使い方とコード簡略化の過程

require 'dl/import'

module User32
  extend DL::Importer
  dlload 'user32'
  extern 'int MessageBoxA(int, char*, char*, int)'
  extern 'int EnumWindows(void*, int)'
end

=begin
cf = DL::CFunc.new(0, DL::TYPE_INT)
cb = DL::Function.new(cf, [DL::TYPE_INT])
cb.bind{|hwnd|
  puts hwnd
  -1
}
=end

=begin
cb = DL::Function.new(DL::CFunc.new(0, DL::TYPE_INT), [DL::TYPE_INT]){|hwnd|
  puts hwnd
  -1
}
=end

def f(hwnd)
  puts hwnd
  -1
end

cb = DL::Function.new(DL::CFunc.new(0, DL::TYPE_INT), [DL::TYPE_INT], &method(:f))

User32.EnumWindows(cb, 0)
User32.MessageBoxA(0, "exit", "caption", 0)

Ruby 2.0 example of EnumWindows

require 'Fiddle'
require 'Fiddle/Import'

module User32
  extend Fiddle::Importer
  dlload 'user32'
  extern 'int MessageBoxA(int,char*, char*, int)'
  extern 'int EnumWindows(void*,int)'
end

cb = Fiddle::Closure::BlockCaller.new(Fiddle::TYPE_INT, [Fiddle::TYPE_INT]) do |hwnd|
  puts hwnd
  -1
end

func = Fiddle::Function.new(cb,[Fiddle::TYPE_INT], Fiddle::TYPE_INT)
User32.EnumWindows(func,0)

Ruby 1.8.7 リファレンスマニュアル > DLモジュール

C
文字 (char)
c
文字を指すポインタ (char *)
H
short 整数 (short)
h
short 整数を指すポインタ (short *)
I
整数 (char, short, int)
i
整数を指すポインタ (char *, short *, int *)
L
long int
l
long int へのポインタ (long *)
F
実数 (float)
f
実数へのポインタ (float *)
D
実数 (double)
d
実数へのポインタ(double *)
S
不変 (immutable) の文字列 (const char *)
s
変更可能(mutable)な文字列 (char *)
A
配列 (const type[])
a
変更可能 (mutable) な配列 (type[])
P
ポインタ (void *)
p
変更可能 (mutable) なポインタ (void *)
0
void 関数 (これはプロトタイプの最初の文字でなければならない)

RubyからWin32APIを叩く

UNZIP32.DLL for windows 9x/Me/NT/200x/XPをRubyから呼び出し 呼び出すAPIごとにオブジェクトができるのは違和感を覚えるので、DLLごとに1オブジェクトに纏めるとこんな感じ

#!/usr/bin/ruby
require 'Win32API'

class Win32Proxy
  def initialize(dll_name)
    @methods = {}
    @dll_name = dll_name
  end

  def method_missing(sym, *args, &block)
    m = @methods[sym]
    m.send('call', *args, &block)
  end

  def register_method(name, params, return_type)
    @methods[name.to_sym] = Win32API.new(@dll_name, name, params, return_type)
  end
end

class UnZip32 < Win32Proxy
  UNZIP32 = 'UNZIP32.DLL'

  def initialize()
    super(UNZIP32)
    register_method('UnZipGetSubVersion', %w(v), 'l')
    register_method('UnZip', %w(p p p l), 'i')
  end
end

unzip32 = UnZip32.new
puts unzip32.UnZipGetSubVersion()
buf = "\0" * 128
cmd = "foo.zip"
unzip32.UnZip(nil, cmd, buf, buf.size)
puts buf.unpack('A*').pack('A*')

ウィンドウ操作

マウス・キーボード操作

Using the Keyboard to Move the Cursor

公式によるサンプルコード。 - GetCursorPos function (Windows) - SetCursorPos function (Windows) - N0ラボ(仮) - Ruby編 - Win32APIを使ってマウスクリックを行わせる - Win32APIを使ってキーボード入力を行わせる - Win32APIを使って特定のウインドウをフォアグラウンドに出す、タイトルからウインドウを取得する - VRubyでGetCursorPos - 近況

Font

フォントの列挙

Node.js