• ベストアンサー

グローバルフック(SetWindowsHookEx)でのEM_REPLACESELの取得について

はじめまして。 グローバルフック(SetWindowsHookEx)を使って別アプリ(exe)がEDITボックスに出力している 文字列を取得しようとしています。 SPY++で確認すると別アプリではEM_REPLACESELを用いていることがわかりました。 フックするDLLを以下のように作成しメッセージをフックすることはできました。 1. フックのセット   SetWindowsHookEx(WH_CALLWNDPROC, MyHookProc, hInst, dwThreadId);      // hInst はDllMainでアタッチ時に保存したもの      // dwThreadIdは別アプリのスレッドID(以下の方法で取得)      // HWND pWnd = ::FindWindow(NULL, 別アプリのフォームのキャプション) ;      // HWND pEdt = ::FindWindowEx(pWnd,0,"Edit",0);      // DWORD dwThreadId= ::GetWindowThreadProcessId(pEdt, NULL); 2. コールバック   LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp)   {    if( EM_REPLACESELの判定 ){      メッセージの保存処理     }     return CallNextHookEx(hMyHook, nCode, wp, lp);   } 上記のコールバックの中で”EM_REPLACESELの判定”をどのようにしたら良いかわからずに困っています。 if分をはずしてファイルにダンプすると何かメッセージが取得できているのは確認できています。 他のサイトを見て、 MSG* pMSG = (MSG*)lp; として、pMSG->lParam を参照してもEM_REPLACESELになっているメッセージがありませんでした。 何か思いつくことがある方、根本的な間違いがあるという方、 アドバイアスをお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

EM_REPLASESELかどうかの判断は pMSG->message だと思いますよ pMSG->lParamは置換後の文字列のように思います コールバックのlParamキャストはCWPSTRUCT* または PCWPSTRUCTで行わないといけない気がします MSG構造体とでは メンバーの並び方も違いますから …

maru_masa
質問者

お礼

MSG* pMSG = (MSG*)lp; を CWPSTRUCT* pCWPS = (CWPSTRUCT*)lp; に変更することで解決できました。 ありがとうございました。

その他の回答 (1)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

pMSG->lParam は機能に対する、 サブパラメータであって、 メッセージそのものではないです。 比較するなら、pMSG->messageでは無いですか?

maru_masa
質問者

お礼

pMSG->messageだけではだめだったのですが、 MSG* pMSG = (MSG*)lp; を CWPSTRUCT* pCWPS = (CWPSTRUCT*)lp; と変更することで、 pCWPS->message にメッセージの種類が入ってきました。 pCWPS->lParam にて出力された文字列も取得できました。 winuser.h のコメントを見るとフックタイプ別に構造体が違うこともわかりました。 大変、ありがとうございました。