はじめまして。
グローバルフック(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になっているメッセージがありませんでした。
何か思いつくことがある方、根本的な間違いがあるという方、
アドバイアスをお願いします。
No.2ベストアンサー
- 回答日時:
EM_REPLASESELかどうかの判断は pMSG->message だと思いますよ
pMSG->lParamは置換後の文字列のように思います
コールバックのlParamキャストはCWPSTRUCT* または PCWPSTRUCTで行わないといけない気がします
MSG構造体とでは メンバーの並び方も違いますから …
MSG* pMSG = (MSG*)lp;
を
CWPSTRUCT* pCWPS = (CWPSTRUCT*)lp;
に変更することで解決できました。
ありがとうございました。
No.1
- 回答日時:
pMSG->lParam は機能に対する、
サブパラメータであって、
メッセージそのものではないです。
比較するなら、pMSG->messageでは無いですか?
pMSG->messageだけではだめだったのですが、
MSG* pMSG = (MSG*)lp;
を
CWPSTRUCT* pCWPS = (CWPSTRUCT*)lp;
と変更することで、
pCWPS->message にメッセージの種類が入ってきました。
pCWPS->lParam にて出力された文字列も取得できました。
winuser.h のコメントを見るとフックタイプ別に構造体が違うこともわかりました。
大変、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- Android(アンドロイド) 【緊急】androidのメッセージは2つ存在しますか? pixel4aを使っています。smsでメッセ 2 2022/09/04 21:05
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Access(アクセス) アクセス IDが空白の時、メッセージボックスがでるようにするには 1 2022/08/04 11:06
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
他のウィンドウのボタンを自動...
-
チェックボックスのキーダウン...
-
メッセージハンドラ
-
VBAでコントロールのハンドルを...
-
SetWindowText関数について
-
SendMessage で ESC など
-
windowsメールスロットについて...
-
フォントの大きさ
-
エクセルで作った新しいウイン...
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
-
VBAのフォント変更(エクセルか...
-
マインクラフト(pc版)で座標...
-
エクセルのコントロールツール...
-
ゲームでは結局どっちが良いの?
-
jw-cadにBMP画像を貼り付けまし...
-
3次元空間上の2つの座標から...
-
コンボボックス内の文字サイズ変更
-
CTreeCtrlのノードごとにアイコ...
-
ダイアログ内コントロールの位...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
他のウィンドウのボタンを自動...
-
msgboxの表示位置
-
メッセージボックスの選択ボタ...
-
VBAでコントロールのハンドルを...
-
メッセージハンドラ
-
SetWindowText関数について
-
VB.netでFindWindowExやると・...
-
CloseHandle()
-
SendMessage で ESC など
-
VBA 複数セルが空白なら印刷さ...
-
デスクトップ上のアイコンの位...
-
点滅で知らせる方法
-
WM_NCLBUTTONUPについて
-
システム例外のメッセージを変...
-
Excel VBA で外部アプリケーシ...
-
VB6でシャットダウン、ログオフ...
-
ElseIfの使い方。
-
WM_CTLCOLORDLG
-
VB.netでSendMessageを使用して...
おすすめ情報