none
SetWindowsHookExでのEM_REPLACESELの取得について RRS feed

  • 質問

  • はじめまして。

     

    グローバルフック(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になっているメッセージがありませんでした。

     

    何か思いつくことがある方、根本的な間違いがあるという方、

    アドバイアスをお願いします。

      Windows XP,VisualStudio2005

     

     

    2008年10月15日 2:01

回答

すべての返信

  • WH_CALLWNDPROCなら、コールバック引数のlpはCWPSTRUCT *ぢゃないですか?。

    2008年10月15日 4:56
  • 早速、試してみました。

    CWPSTRUCT* pCWPS = (CWPSTRUCT*)lp; と変更することで、

    pCWPS->message にメッセージの種類が入ってきました。

    pCWPS->lParam にて出力された文字列も取得できました。

     

    winuser.h のコメントを見るとフックタイプ別に構造体が違うこともわかりました。

     

    大変、ありがとうございました。

     

     

     

     

    2008年10月15日 5:29