たくさんのことを試しましたが、タスクバーが非表示になったり、デスクトップ UI に他の超自然的な効果が表示されたりする中で、一貫して動作させることができません。
最初にオープン ライブラリhttp://mwinapi.sourceforge.net/を使用してみました。ウィンドウなどを列挙するためのOOレイヤーとしてはうまく機能しましたが。フックを適切に実行できませんでした
次の目的地は、.Net フレームワークの Windows フックに関する Dino E. の投稿でした。テキストを理解し、これを機能させようとしていたので、私は自分のタイプを書くことになりました。
私の意図は、このアプリを実行し、実行中に作成されたすべてのウィンドウをログに記録できるようにすることです。すべての目玉を呼んでいます...
更新:どうやら.Net / マネージ コードでグローバル ウィンドウ フックを記述できないため、切り捨てました(一部の低レベルのマウスまたはキーボード フックを除く) 。
そこで、C++ に切り替えました。それでも、すべての WinAPI 呼び出しは有効なハンドルを返しますが、フィルター関数が呼び出されていません。通知を受け取っていないようです。それでもうまくいきません...誰かが間違いを見つけることができますか。
void CWinHookFacade::Hook()
{
HMODULE hCurrentDll = LoadLibrary(_T("[Path to my hook dll]"));
m_HookHandle = SetWindowsHookEx(WH_CBT,
FilterFunctionForHook,
hCurrentDll,
0);
if (m_HookHandle == NULL)
{
throw new std::exception("Unable to hook");
}
}
void CWinHookFacade::Unhook()
{
if (!UnhookWindowsHookEx(m_HookHandle))
{
throw new std::exception("Unhook failed!");
}
m_HookHandle = NULL;
}
LRESULT CWinHookFacade::FilterFunctionForHook(int code, WPARAM wParam, LPARAM lParam)
{
if (code >= 0)
{
switch(code)
{
case HCBT_CREATEWND:
wprintf(_T("Created Window"));
break;
case HCBT_ACTIVATE:
wprintf(_T("Activated Window"));
break;
case HCBT_DESTROYWND:
wprintf(_T("Destroy Window"));
break;
}
}
return CallNextHookEx(m_HookHandle, code, wParam, lParam);
}
クライアント exe は次のように Hook_DLL を呼び出します
int _tmain(int argc, _TCHAR* argv[])
{
CWinHookFacade::Hook();
getchar();
CWinHookFacade::Unhook();
}