Windows detours ライブラリを使用してサードパーティのアプリケーションに挿入する Qt Dll があります。
if(!DetourCreateProcessWithDll( Path, NULL, NULL, NULL, TRUE,
CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, NULL, NULL,
&si, &pi, "C:\\Program Files\\Microsoft Research\\Detours Express 2.1\\bin\\detoured.dll",
"C:\\Users\\Dave\\Documents\\Visual Studio 2008\\Projects\\XOR\\Debug\\XOR.dll", NULL))
次に、システム全体のフックを設定して、ウィンドウの作成をインターセプトします。
HHOOK h_hook = ::SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTProc, Status::getInstance()->getXORInstance(), 0);
XOR はプログラム名で、Status::getInstance() はグローバルを保持するシングルトンです。
私の CBTProc コールバックでは、QWidgets であるすべてのウィンドウをインターセプトしたいと考えています。
HWND hwnd= FindWindow(L"QWidget", NULL);
対応する HWND を取得するので (Spy++ で確認しました)、うまく機能します。次に、QWidget へのポインターを取得したいので、その関数を使用できます。
QWidget* q = QWidget::find(hwnd);
しかし、ここに問題があります。返されるポインターは常に 0 です。コードをプロセスに正しく挿入していませんか? それとも QWidget::find() を使用していませんか?
ありがとう、
デイブ
編集: QWidget::find() 関数を DLL のエクスポートされた関数に変更すると、フックを設定した後 (ブレークポイントを設定してキャッチできるようになります)、QWidgetPrivate::mapper は NULL になります。