Win32で新しいウィンドウが作成されたときに通知を受けるにはどうすればよいですか?
質問
Win32を使用して、新しいウィンドウが作成されたときに通知を登録する方法はありますか。現在開いているウィンドウのリストを保持しようとしていますが、現在は EnumWindows()
を使用して現在のウィンドウのリストをポーリングしています。
誰でも似たようなことをしましたか?
ありがとう
これを正しく行っているかどうかはわかりませんが、SetWindowsHookExメソッドを起動することはできません。
何か気になりますか?
こちらが私の切り抜きです
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(HookType hook, HookProc callback, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll")]
private static extern int CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
const int HSHELL_WINDOWCREATED = 1;
private static HookProc winDelegate = ShellHookProcDelegate;
internal static void RegisterWindowCreatedEvent()
{
SetWindowsHookEx(HookType.WH_SHELL, winDelegate, IntPtr.Zero, 0);
}
private static int ShellHookProcDelegate(int code, IntPtr wParam, IntPtr lParam)
{
if (code != HSHELL_WINDOWCREATED)
{
return CallNextHookEx(IntPtr.Zero, code, wParam, lParam);
}
//App specific code here
return CallNextHookEx(IntPtr.Zero, code, wParam, lParam);
}
解決
SetWindowsHookEx
を使用しますa> WH_SHELL
をセットアップするフックして、 HSHELL_WINDOWCREATED
イベントを探します。
他のヒント
もちろん- CBTフックを記述して、 HCBT_CREATEWND
。 SetWindowsHookEx()
も参照してください。
これにより、作成中のウィンドウが完全に初期化される前に、すべてのウィンドウ作成が通知されるようになります。必要なものがすべて所有されていないトップレベルウィンドウの場合、 RichieHindleの提案うまくいくかもしれません...
迂回では、任意のWin32関数にフックを添付できます。ただし、ポーリングはおそらくより確実に問題にアプローチする方法です。特定のウィンドウ作成方法を見逃したかどうかを心配する必要はありません(Win32にはいくつありますか?もちろん、実行時にWindows関数のマシンコードを書き換えることはありません。
しかし、あなたはあなたの電話を知っています。
オートホットキー用に WinEventHook ライブラリを試すことができます。 メモ帳のポップアップブロッカー例を次のように変更してみてください。 :
HookProc(hWinEventHook、Event、hWnd、idObject、idChild、dwEventThread、dwmsEventTime)
{
ifイベントEVENT_SYSTEM_FOREGROUND = 0x3
{
WinGetTitle、タイトル、ahk_id%hWnd%
If(title =" your_window_name"
msgbox、ウィンドウが作成されました
}
}