1

SendMessage と EM_REPLACESEL を介してメモ帳にテキストを送信する小さなアプリケーションを作成しました。

ここで、メモ帳をフックして EM_REPLACESEL 値 (lParam 値、この場合は「GET THIS TEXT」テキスト) を取得しようとしています。

Spy++ からの画像

編集: この写真を参照してください: http://i.stack.imgur.com/8scNL.jpg

フックは正常に動作します。私の問題は、EM_REPLACESEL メッセージをリッスンし、lParam から値を取得することです。

メッセージがメモ帳に送信されると、このコードは正常に機能します。

LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
    Beep (2000,100);
    return(CallNextHookEx(g_hHook, nCode, wParam, lParam));
}

そこで、EM_REPLACESEL メッセージをインターセプトしたいと思います。これは機能しません:

LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
    if (nCode == EM_REPLACESEL)
    {
        Beep (2000,100);
    }
    return(CallNextHookEx(g_hHook, nCode, wParam, lParam));
}

1) EM_REPLACESEL メッセージをリッスンする方法は?

2) lParam 値を取得して MessageBox に表示する方法などのメッセージを受け取った場合。このようなもの:

LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
    if (nCode == EM_REPLACESEL)
    {
        MSG *lpMsg;
        lpMsg = (MSG *) lParam;
        MessageBox(NULL,(LPCWSTR)lpMsg,NULL,NULL);
    }
    return(CallNextHookEx(g_hHook, nCode, wParam, lParam));
}

ありがとう

4

3 に答える 3

3

EM_REPLACESEL投稿されたメッセージではなく、送信されたメッセージであるため、WH_CALLWNDPROCフックの代わりにフックを使用する必要がありますWH_GETMESSAGE

LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
    if (nCode == HC_ACTION) {
        CWPSTRUCT* cwps = (CWPSTRUCT*)lParam;
        if (cwps->message == EM_REPLACESEL) {
            Beep (2000,100);
            // etc..
        }
    }
    return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

... = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, ...), 
于 2013-07-05T17:49:46.900 に答える
2

GetMsgProc () コールバックのコードが間違っています。リンク先の MSDN ページを注意深く読んで、コールバックの引数の意味を確認してください。nCode引数はメッセージ番号ではなく、メッセージを処理するかどうかを指定します。渡されたlParamを使用して、傍受したメッセージを復元します。代わりに、次のようにします。

LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
    if (nCode == HC_ACTION) {
        MSG* pmsg = (MSG*)lParam;
        if (pmsg->message == WM_LBUTTONDOWN) {
            Beep (2000,100);
            // etc..
        }
    }
    return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

WH_GETMESSAGE フックを使用しているように見えることに注意してください。PostMessage() でメッセージ キューにポストされたメッセージに対してのみ機能します。ただし、EM_REPLACESEL は SendMessage() で送信されるメッセージです。これには、別のフック WH_CALLWNDPROC または WH_CALLWNDPROCRET が必要です。

于 2013-07-05T10:54:37.093 に答える
0

これが私が通常行う方法です。

LRESULT CALLBACK GetMsgProc(MSG nCode, WPARAM wParam, LPARAM lParam) 
{
   while(GetMessage(&nCode, NULL, 0, 0) > 0)
   {
      if(nCode.message == EM_REPLACESEL)
      {
         //Do something
      }
      else
         DispatchMessage(&nCode);
   }
   return 0;
}
于 2013-07-05T12:00:48.287 に答える