- 締切済み
グローバルフック
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_setwindowshookex.htm に フックタイプがスレッドとグローバルの両方をサポートしている場合、最初にスレッドフックが呼び出され、次にグローバルフックが呼び出されます。 と書いてありますが、WH_GETMESSAGEでフックしてWM_USERを発生させてみてもMessageProcは1回しか実行されていないようでした。 MessageProcが2回実行されるという解釈は間違っていますか?
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- taka_tetsu
- ベストアンサー率65% (1020/1553)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
関連するQ&A
- マウスホイールをフックしたい
かなり突っ込んだ質問かもしれませんが Win32API系の質問です。 マウスホイールをフックするコードを書いています。 フックはDLLが必要なグローバルフックではなく スレッドローカルなフックです。 具体的には 1.SetWindowsHookEx APIでWH_MOUSEタイプをフック 2.MouseProcフックプロシジャーでWM_MOUSEWHELLメッセージはフックできている。 ここまでは良いのですが ホイールの回転方向がわかりません。 MouseProcフックプロシジャーのlParamを MOUSEHOOKSTRUCT構造体へキャストしても dwExtraInfo追加情報には何も入っておらず (オールゼロでした。) 行き詰っています。 試しにフック後に PeekMessageも試みましたがダメでした。 諸事情でグローバルフックは使いたくなくて スレッドローカルなフックで解決したいのですが 良い方法は無いでしょうか? 試しにフックタイプを WH_CALLWNDPROC WH_GETMESSAGE とこれらも試してみましたがNGでした。 なお、WH_JOURNALRECORDフックは ユーザの操作でキャンセルされてしまうので あまり使いたくありません。 経験者の方、アドバイス頂けると助かります。 宜しく御願いします。
- ベストアンサー
- C・C++・C#
- SetWindowsHookEx(グローバルフック)の質問
SetWindowsHookExでグローバルフックして メッセージをすりかえる事って可能でしょうか? 例えばWM_KEYDOWNが送られてきたら、それを無視して WM_CLOSEとかえるといった具合に。 試しにWH_CALLWNDPROCで受け取ったメッセージを 書き換えるだけでは無理でした(WindowsXp SP2) MSDNのWH_CALLWNDPROCRETの関数CallWndRetProcの説明で 「このフックプロシージャは、メッセージを調べることはできますが、変更することはできません。」 となっていました。 ということはWH_CALLWNDPROCのCallWndProcでは変更できるのかな?と思った次第です。 何か情報があれば宜しくお願いします。 (2000では不可だけど98だとできるとか?)
- ベストアンサー
- C・C++・C#
- グローバルフック?にならない(SetWindowsHookEx:WH_CALLWNDPROC)
とあるアプリケーションがアクティブウィンドウである場合、 とあるキーを抑制するアプリを作っているのですが、 とあるキーを抑制するのは低レベルキーフック用のDLLを用意して実現しました。 とあるアプリケーションがアクティブウィンドウである場合は、 500msのタイマで監視していたのですが、かっこわるいので ウィンドウイベントをフックしてWM_ACTIVATEあたりを拾って 拾ったときのウィンドウハンドルがとあるアプリケーションのウィンドウか否かで 判断しようかなんて思ったのです。 で、本題です。 SetWindowsHookEx(WH_CALLWNDPROC, &HookProc, g_hInst, NULL); と、実行しているのですが、自分のウィンドウと、IMEとか、 合計3~4種のウィンドウのイベントしか拾えません。 電卓を起動しても電卓のイベントが何も拾えなかったり。 デバッグだからだめなのかと思い、ログファイルに吐かせた結果 こういった状況です。 ロギングしたイベントは特にマスクせずに、コールバックが呼ばれ、 HC_ACTIONであった場合に全て書き出してみました。 そこで質問です。 SetWindowsHookEx(WH_CALLWNDPROC~ では、デスクトップ上の全てのウィンドウのイベントを覗き見できる 訳ではないのでしょうか? それとも、やり方がわるいのでしょうか? 宜しくお願いします。 #SetWindowsHookExの取り扱いについてはMSDN上で確認できる #部分についてはわかっているつもりです。
- 締切済み
- C・C++・C#
- WM_INITDIALOGのフック
どこにも載っていないため質問させていただきます。 次のようなコードを書いたとき、ダイアログの出現の検知ができるWM_INITDIALOGを検知できないのはなぜでしょうか。 hHookForDialog = SetWindowsHookEx(WH_CALLWNDPROCRET, CallWndRetProcForDialog, hDll, 0); LRESULT CALLBACK CallWndRetProcForDialog(int nCode, WPARAM wp, LPARAM lp) { if(nCode < 0) return CallNextHookEx(hHookForDialog, nCode, wp, lp); PCWPRETSTRUCT Wmes = (PCWPRETSTRUCT)lp; if(nCode == HC_ACTION) { if(Wmes->message == WM_INITDIALOG) { PostMessage(hWndToSendMessage, mesDialogCreated, (WPARAM)(Wmes->hwnd), NULL); } } return CallNextHookEx(hHookForDialog, nCode, wp, lp); } フック自体は成功しているようで、条件文を外すとメッセージはたくさん飛んできます。 けれども目的のWM_INITDIALOGは無いようです。 どうすればいいのかご教授お願いします。
- 締切済み
- C・C++・C#
- timeの引数と戻り値
http://www.microsoft.com/JAPAN/developer/library/vccore/_crt_time.htm 上記サイトで、少しスクロールを下げると、解説のことろで、 引数は NULL でもかまいませんと書かれています。 引数を NULL にして使うのはどういった場合の時ですか?
- ベストアンサー
- C・C++・C#
- グローバルフック(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になっているメッセージがありませんでした。 何か思いつくことがある方、根本的な間違いがあるという方、 アドバイアスをお願いします。
- ベストアンサー
- C・C++・C#
- マウスフックについて
Dllにてマウスフックをして、左ボタンが押しあがったらWM_LBUTTONUPされたら メッセージを送信するというものです。 そのときに、マウスの位置はどこにあってもいいのです。 たとえば、自分のウインドウの中で左ボタンを押して、 デスクトップ上などで左ボタンがあがったらメッセージを送信するというようにしたいのですがうまくいきません。 以下がソースです。 よろしくお願いします。 #include <windows.h> #include "MouseHook.h" HINSTANCE hInst; HHOOK hHook; HWND hWnd; BOOL bHook; int WINAPI DllMain(HINSTANCE hInstance, DWORD fdReason, PVOID pvReserved) { hInst = hInstance; return TRUE; } EXPORT int SetMainHWND(HWND hMainWindow) { hWnd = hMainWindow; return 0; } EXPORT BOOL IsHooking() { if (bHook) return TRUE; else return FALSE; } EXPORT int MouseHookSet() { hHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseHookProc,hInst, NULL); if (hHook == NULL) { return -1; } else { bHook = TRUE; return 0; } } EXPORT int MouseHookEnd() { if (UnhookWindowsHookEx(hHook) != 0) { bHook = FALSE; return 0; } else { return -1; } } EXPORT LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) { MOUSEHOOKSTRUCT *pmh; pmh = (MOUSEHOOKSTRUCT *)lParam; if (wParam == WM_LBUTTONUP) { SendMessage(hWnd,MOUSEHOOK_LBUTTONUP,0,0); } if (wParam == WM_NCLBUTTONUP) { SendMessage(hWnd,MOUSEHOOK_LBUTTONUP,0,0); } return CallNextHookEx(hHook,nCode,wParam,lParam); }
- ベストアンサー
- C・C++・C#
- MSDNのセットアップ方法(ヘルプが見たいだけなんです。)
Visual Basic 6.0 Professional Editionです。 ヘルプを見ようとしたら、「MSDNをインストールしてください。」と言われました。 インストール作業を開始すると、「Microsoft Developer Network ディスクの 1 を挿入してください」といわれました。 そ そんなCDもってないんですけど、、、、(汗.) 私 ヘルプを見たいだけなのにぃ~ ヘルプを参照できるようにするには、どうすればよろしいでしょうか。 教えてくださいませ。 okweb 過去ログから「MSDN ライブラリ」のURLはわかったのですが、これだと毎回オンラインにしないといけないです。 http://www.microsoft.com/japan/developer/library/default.asp
- ベストアンサー
- Visual Basic
- 「Microsoft Visual Studio97 SP3」を探しています
「Microsoft Visual Studio97 SP3」を探しています。 http://www.microsoft.com/japan/developer/vstudio/defaultsp3.htm にあったようなのですが、今はページが存在しません。 今、SP3を入手する方法はありますでしょうか?
- ベストアンサー
- Visual Basic
- ESET Mobaile Securityのインストールについての疑問点があります。
- スマホとパソコンの製品のバージョンが異なっていますが、問題はありませんか?
- パソコンの製品のバージョンが異なることに問題はありませんか?