IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

私的 Win32 API メモ

いろいろ勉強した

忘れてしまいそうなので書き下しておく

雰囲気的なこと

  • ウィンドウ
    • 俗にいうウィンドウではなく、 GUI の部品全般(ボタンとか、ツールバー)も含む
    • 俗にいうウィンドウは、フレームとか言う
  • ハンドル
    • ポインタみたいなもん
  • 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
  • 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 で開放