私的 Win32 API メモ
いろいろ勉強した
忘れてしまいそうなので書き下しておく
雰囲気的なこと
- ウィンドウ
- ハンドル
- ポインタみたいなもん
- HWND
- ウィンドウのハンドル
- DOM でいうと Node みたいなもん
- LPXXX
- XXX のポインタって意味
- owner と popup
- 「ポップアップさせたウィンドウ = owner」と「ポップアップしたウィンドウ = popup」
- DOM でいうと
- owner は、 window.opener で
- popup は、 window.frames って感じ
- HINSTANCE
- DLL とか EXE とかひとつと対応してるハンドル
- アプリケーションの HINSTANCE というと実行されている EXE のハンドル
- DLL や EXE のメモリ上の位置
- HMODULE とは同じもの
あまり本質的でないこと
- W で終わる関数は WCHAR
- WideCharToMultiByte を使えば、 WCHAR -> char
int len = WideCharToMultiByte(CP_UTF8, 0, wbuf, wlen, buf, sizeof(buf) - 1, NULL, NULL);
ウィンドウの取得
- HWND GetWindow(HWND, 定数)
- 様々な方向に、要素を取得しにいく
- GetWindow(HWND, GW_CHILD)
- DOM でいうと node.firstChild
- GetWindow(HWND, GW_HWNDNEXT)
- DOM でいうと node.nextSibling
- GetWindow(HWND, GW_HWNDPREV)
- DOM でいうと node.previousSibling
- GetWindow(HWND, GW_HWNDFIRST)
- DOM でいうと node.parentNode.firstChild
- GetWindow(HWND, GW_HWNDLAST)
- DOM でいうと node.parentNode.lastChild
- GetWindow(HWND, GW_OWNER)
- DOM でいうと window.opener
- GetWindow(HWND, GW_ENABLEDPOPUP)
- DOM でいうと window.frames[0]
- HWND GetParent(HWND)
- DOM でいうと node.parentNode
- AnyPopup
- ポップアップウィンドウを持ってるか
- DOM でいうと (window.frame.length != 0)
- BOOL EnumChildWindows(HWND, WNDENUMPROC, LPARAM)
- DOM でいうと node.getElementsByTagName('*').forEach(function() { }); みたいなもん
- 第三引数は何でも OK (ポインタとか入れとけば OK)
- あっちこっち何回もトラバースするときは、これ使えってことらしい
- HWND GetDesktopWindow()
- デスクトップのウィンドハンドルを返す
- DOM でいうと document.documentElement とか document.body
WHND から取得できる情報
- Class
- ClassName
- GetClassName(hwnd, buf, len)
- WNDCLAASSEX
- GetClassInfo(hinstance, name, &info) で取れる
- hinstance は GetWindowLong で
- WNDCLAASSEX は情報満載
- http://homepage1.nifty.com/kan01/program/vc/win_info.htm
- lpfnWndProc で、メッセージ処理
- ClassName
- HINSTANCE
- GetWindowLong(hwnd, GWL_HINSTANCE)
- CreateWindow, CreateWindowEx したときに渡したやつ
- スタイル
- GetWindowStyle(HWND) & flags, GetWindowExStyle(HWND) & flags
- LVS_ とか TBSTYLE_ とか CCS_ とか WS_ とか Class Name によっていろいろ
- タイトル的な何か
- GetWindowText(hwnd, buf, sizeof(buf) - 1)
- 矩形
- GetWindowRect(hWnd,&rect)
- ウィンドウを作成したプロセス ID とスレッド ID
- threadid = GetWindowThreadProcessId(HWND, &processid)
- プロセス ID から HINSTANCE を得る
- OpenProcess 使う
- SendMessage
- なんでもあり、奥義
- SendMessage で情報を取得する場合で、外部プロセスのウィンドウの場合は VirtualAllocEx で
- VirtualAllocEx
- 外部プロセスのメモリを確保
- HWND → GetWindowThreadProcessId → OpenProcess → VirtualAllocEx の手順
- ReadProcessMemory で読む
- VirtualFreeEx で開放