アプリ版:「スタンプのみでお礼する」機能のリリースについて

はじめまして。

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

何か思いつくことがある方、根本的な間違いがあるという方、
アドバイアスをお願いします。

A 回答 (2件)

EM_REPLASESELかどうかの判断は pMSG->message だと思いますよ


pMSG->lParamは置換後の文字列のように思います

コールバックのlParamキャストはCWPSTRUCT* または PCWPSTRUCTで行わないといけない気がします
MSG構造体とでは メンバーの並び方も違いますから …
    • good
    • 0
この回答へのお礼

MSG* pMSG = (MSG*)lp;

CWPSTRUCT* pCWPS = (CWPSTRUCT*)lp;
に変更することで解決できました。

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

お礼日時:2008/10/15 14:34

pMSG->lParam は機能に対する、


サブパラメータであって、
メッセージそのものではないです。
比較するなら、pMSG->messageでは無いですか?
    • good
    • 0
この回答へのお礼

pMSG->messageだけではだめだったのですが、
MSG* pMSG = (MSG*)lp;

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

お礼日時:2008/10/15 14:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!