0

2つの質問。

1)これは期待される結果であるに違いないことは理解していますが、誰かが私が間違っていることを教えてくれるかもしれません。グローバルフックですべてのウィンドウクラスをサブクラス化しようとしていますが、正常にショップを閉じることができず、フックを最初に登録したプログラムがフックの登録を解除して終了すると、サブクラス化されたアプリケーションがクラッシュし始めます。

これが私がやろうとしている方法です。

// stores original wndprocs. In the hook dll, outside the shared memory.
map<HWND, WNDPROC> origWndProcs;

// in an EnumWindows callback, executed for all HWND's, also in the hook dll (UWM_REMOVE_HOOK is a registered unique message)
SendMessageTimeout(hWnd, UWM_REMOVE_HOOK, 0, 0, SMTO_ABORTIFHUNG | SMTO_NORMAL, 15000, res);

// Still in the same hook, in the subclassing wndproc..
if (msg == UWM_REMOVE_HOOK) {
   if (origWndProcs.find(hwnd) != origWndProcs.end()) {
      SetWindowLongPtr(hwnd, GWL_WNDPROC, (LONG_PTR)origWndProcs[hwnd]);
   }
}

// clears the hook..
__declspec(dllexport) BOOL ClearHooks(HWND hWnd) {

    BOOL unhooked = UnhookWindowsHookEx(hook) &&
       UnhookWindowsHookEx(kb_hook) &&
       UnhookWindowsHookEx(mouse_hook) && 
       UnhookWindowsHookEx(cbt_hook);

    if(unhooked)
       hWndServer = NULL;
    return unhooked;
}

DllMainでは、DLL_PROCESS_DETACHに対して何もしません。代わりに、ClearHooks()は、フックを最初に登録したプログラムから呼び出され、フックがEnumWindows操作を実行したことを通知するメッセージを送信した後にのみ呼び出されます(元のwndprocを復元します。上記を参照)。

WndProcフックでウィンドウをサブクラス化します。メッセージを受信し、現在のwndprocがdll内のウィンドウではない、表示されているすべてのウィンドウがサブクラス化されます。

基本的に、すべての(私が知る限り)アプリケーションは、Windowsがwndprocを置き換えられたときの状態に戻しているように見えるにもかかわらず、終了時にクラッシュします。誰かが私が間違っているかもしれないことの手がかりを持っていますか?

2)これは、WM_MINMAXINFOをインターセプトし、ウィンドウが最大化されるたびにウィンドウのmaxsizeを変更するために必要です。残念ながら、dllでこれを行うことはできませんが、サイズ情報を取得するためにプログラムと通信する必要があります。それで、そのウィンドウと話すための最良の方法は何ですか。元のWM_MINMAXINFOメッセージに付属していた構造を変更できるように、いくつかの情報を返すために必要です。WM_COPYDATAの構造体は、SendMessageTimeoutの呼び出しが返されるまで、そのデータを保持しますか?

ありがとう

4

1 に答える 1

0

ここには多くの問題点があります。他のコードがウィンドウをサブクラス化しないと想定します。そして、そのようなコードは正しい順序でサブクラスを解除します。正しい順序はありません。フックはプログラムの実行とはまったく非同期です。

ただし、回避策は簡単です。あなたはすでにSetWindowsHookExに夢中です、もう1つやったほうがいいかもしれません。何をしたいかに応じて、WH_CALLWNDPROCまたはWH_CALLWNDPROCRET。

于 2010-10-16T18:00:43.490 に答える