Windows2000 フックについて

このQ&Aのポイント
  • Windows2000のフックとは何ですか?キーボード操作を制限する方法について教えてください。
  • Windows2000のフックをDLL化してVBで呼び出したいですが、エラーが出てうまくいきません。キーボードプロシージャを作成し、KBDLLHOOKSTRUCTの宣言にエラーが出ます。
  • DLL化やフックについて調査しましたが、初めてのため不慣れです。助言や指摘、正しい方法を教えてください。
回答を見る
  • ベストアンサー

windows2000 フックについて

教えてください。 Ctrl + Esc、Alt + Tab、 Alt + Escを使用不可にしたいと思いフックを使用し作成しています。 それをDLLにして、VBにて呼び出そうとしているのですが、うまくいきません。 まず、はじめにKeyboardProcを作成したのですが、KBDLLHOOKSTRUCTが宣言されていないとでます。 呼び出し関数とかあるのでしょうか? [環境] OS windows2000 VC++6.0 DLL化 [ソース] LRESULT CALLBACK KeyboardProc(int p_nCode, WPARAM p_wParam, LPARAM p_lParam) { KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam; //<--ここでエラーがでる。 BOOL bControlKeyDown = 0; if( p_nCode < 0 || p_nCode == HC_NOREMOVE ){ return CallNextHookEx( hHook, p_nCode, p_wParam, p_lParam ); } switch (p_nCode) { case HC_ACTION: { bControlKeyDown = GetAsyncKeyState (VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1); if (pkbhs->vkCode == VK_ESCAPE && bControlKeyDown) return 1; if (pkbhs->vkCode == VK_TAB && pkbhs->flags & LLKHF_ALTDOWN) return 1; if (pkbhs->vkCode == VK_ESCAPE && pkbhs->flags & LLKHF_ALTDOWN) return 1; break; } default: break; } CallNextHookEx( hHook, p_nCode, p_wParam, p_lParam ); return TRUE; } EXPORT long __stdcall HookSet() { hHook = ::SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc, NULL, 0 ); return 1; } DLL化やフックについていろいろ調べたのですが、初めてのため、可笑しい個所があるかとは思いますが、すみませんが教えてください。よろしくお願いします。

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.7

>私がつまずいたのは、#define _WIN32_WINNT 0x0400 >でした。 軽くここに書いてありますね。 http://www.kumei.ne.jp/c_lang/sdk3/sdk_264.htm ちゃんとはここに。 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winprog/winprog/using_the_windows_headers.asp ようは、OSやIEのバージョンごとに使用可能なAPIなどが違うんで、ターゲットのOSを決めてねということです。 >ヘッダーの中を見ていましたが、#ifとかの意味がわからなかったと言うのもありましたし、 >リンクだけしていればOKという勘違いもしていました。 #ifなどは、プリプロセッサ命令といいます。 http://www.shibu.jp/cppreference/preproc_details.html #参考url入れてますけど、VC++付属のヘルプのほうに、みんなちゃんと書いてありますんで。

その他の回答 (6)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.6

>VC++6発売時点でなかったものについては、当然定義はヘッダ中に存在しません。 うそ書いちゃいました。ごめんなさい。 失礼しました。VC++付属のヘッダに定義されてましたね。 NT4.0SP3以降ってことはVC6++発売前でした。 >VC++付属のものと、インストールしたSDK付属のものの違いを自分で確認してみてください。 ほとんど内容変わってませんね。 まぁ、エラーになる理由はヘッダファイル見ればわかると思うんで、見てみてください。

poposan
質問者

お礼

ありがとうございました。 >うそ書いちゃいました。ごめんなさい。 大丈夫です。一様確認してましたので気づきました。 私がつまずいたのは、#define _WIN32_WINNT 0x0400 でした。 よくわからなかったです。 ヘッダーの中を見ていましたが、#ifとかの意味がわからなかったと言うのもありましたし、リンクだけしていればOKという勘違いもしていました。 #define _WIN32_WINNT 0x0400 の記述理由がいまいちわからないのですが・・・・勉強するしかないですね。わかったのはヘッターにある条件文で使用すると言うことだけです。 ALT+TAB、CTRL + ESC、ALT+ESC、windowsmenu等のキーを制御することは出来ました。 とても勉強になりました。本当にありがとうございました。VC++は奥が深いです。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.5

ソースの先頭(#include<windows.h>より上)、もしくはstdafx.hの中(あるなら)に、 #define _WIN32_WINNT 0x0400 の1行を追加してみてください。 (まぁ0x0500でも0x0501でもかまいませんが。) プロジェクトの設定のプリプロセッサの定義でも構いません。 >WH_KEYBOARDは認識できて、WH_KEYBOARD_LLは定義されていない識別子と出るのはおかしいですよね。 >同じwin32のSetWindowsHookExにあるものですよね? というか、ヘッダファイルにかかれています。 一度、WH_KEYBOARDが定義されているヘッダファイルを眺めてみることをお勧めします。多分、winuser.hだと思いますが。 で、VC++付属のものと、インストールしたSDK付属のものの違いを自分で確認してみてください。 そうすれば、なぜだめだったのかも理解できると思います。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>SDKをコピーして、http://www.microsoft.com/japan/msdn/windows/windowsxp/xpvisualstyles.asp >をにあるソースを実行させました。ですが、問題が出ます。 コピーってインストールのことですよね? インストール後に、ヘッダファイルやLibファイルの場所をVC++に指定させる作業はしましたか? VC++のツールのメニューから設定できますし、 スタートメニューに追加されたのSDKの、「Visual Studio Registration」にある「Register PSDK Directories with Visual Studio」を実行すれば設定してくれます。

poposan
質問者

補足

ありがとうございます。 >コピーってインストールのことですよね? >インストール後に、ヘッダファイルやLibファイルの場>所をVC++に指定させる作業はしましたか? >VC++のツールのメニューから設定できますし、 >スタートメニューに追加されたのSDKの、「Visual >Studio Registration」にある「Register PSDK >Directories with Visual Studio」を実行すれば設定 >してくれます。 両方試したのですが、うまくいきませんでした。 WH_KEYBOARDは認識できて、WH_KEYBOARD_LLは定義されていない識別子と出るのはおかしいですよね。 同じwin32のSetWindowsHookExにあるものですよね? win32のDLLがおかしいのでしょうか?

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>とりあえず今回はTABのみにしました。(本当はALT + TAB 等なんですが、よくわからないので) あのう・・・ #1のurlのKB読んでくれました? ALT+TABとALT+ESCをキャンセルするのはRegisterHotKey()を使うといいよ、そうじゃなくてCTL+ESCも含めてキャンセルるすんだったらWH_KEYBOARD_LLでフックかけてって書いてあるんですけど。 >hHook = ::SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc, hInstDLL, 0 ); かけてるフック、WH_KEYBOARD_LLじゃなくてWH_KEYBOARDですよね。 一応サンプル見つけたんで。 http://www.microsoft.com/japan/msdn/windows/windowsxp/xpvisualstyles.asp ということで、以下のことは関係なくなってしまいますが、一応。 >一様バグがありますが、VK_TABを認識はしています。 ただ、無効に出来ていません。 無効にするにはどうしたらよろしいのでしょうか。 HC_NOREMOVEを何で処理していないんですか?

poposan
質問者

補足

遅くなって申し訳ありません。 SDKをダウンロードしたり、いろいろ試していたりして遅くなりました。 SDKをコピーして、http://www.microsoft.com/japan/msdn/windows/windowsxp/xpvisualstyles.asp をにあるソースを実行させました。ですが、問題が出ます。 error C2065 WH_KEYBOARD_LLとKBDLLHOOKSTRUCTが定義されていない識別子です。と出るのです。 ただ、winuser.hは認識しているみたいなのですが・・・・(pkbdllhook->vkCodeはメソッド表示されるので) WH_KEYBOARD_LLとKBDLLHOOKSTRUCTを定義する場所がおかしいのでしょうか?それとも他に設定があるのでしょうか? ご存知の方申し訳ありませんが、教えてください。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

#1の方法ですと、Ctrl+ESCはだめですね。 エクスプローラにHotkey登録されちゃってるようです。 まぁ、これは特殊なキー操作じゃないんで普通にフックできると思いますんで。 で、 >まず、はじめにKeyboardProcを作成したのですが、KBDLLHOOKSTRUCTが宣言されていないとでます。 VC++6発売時点でなかったものについては、当然定義はヘッダ中に存在しません。 最新のSDKをダウンロードしてインストールしてください。 http://www.microsoft.com/msdownload/platformsdk/sdkupdate/

参考URL:
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
poposan
質問者

補足

//ヘッダー HINSTANCE hInstDLL; //DLLのインスタンスハンドル #include <windows.h> #define EXPORT extern "C" __declspec(dllexport) #define MY_NOTIFYICON (WM_APP+100) HWND hWndtgt = NULL; HHOOK hHook = NULL; EXPORT long __stdcall HookSet(); EXPORT long __stdcall unHook(); //----------------------------------------------------------------- //ソース #include "notkey.h" LRESULT CALLBACK KeyboardProc(int p_nCode, WPARAM p_wParam, LPARAM p_lParam) { if( p_nCode < 0 || p_nCode == HC_NOREMOVE ){ return CallNextHookEx( hHook, p_nCode, p_wParam, p_lParam ); } switch (p_nCode) { case HC_ACTION: { if (p_wParam == VK_TAB) { SendMessage(hWndtgt,MY_NOTIFYICON,p_wParam,p_lParam); return 1; } if (p_wParam == VK_MENU) { SendMessage(hWndtgt,MY_NOTIFYICON,p_wParam,p_lParam); return 1; } break; } default: break; } return CallNextHookEx( hHook, p_nCode, p_wParam, p_lParam ); } // DLLMain int WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, PVOID pvReserved) { UNREFERENCED_PARAMETER(hInst); UNREFERENCED_PARAMETER(pvReserved); hInstDLL = hInst; return TRUE; } EXPORT long __stdcall HookSet() { hHook = ::SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc, hInstDLL, 0 ); if(hHook == NULL){ return 0; } return 1; } EXPORT long __stdcall unHook() { if(hHook != NULL){ ::UnhookWindowsHookEx(hHook); } return 1; } //VB ' Public Declare Function HookSet Lib "D:\work\dlltest\win32dll.DLL" () As Long Public Declare Sub unHook Lib "D:\work\dlltest\win32dll.DLL" () '呼び出し関数 nlng = HookSet() 'セット call unHook() '解除 一様バグがありますが、VK_TABを認識はしています。 ただ、無効に出来ていません。 無効にするにはどうしたらよろしいのでしょうか。 とりあえず今回はTABのみにしました。(本当はALT + TAB 等なんですが、よくわからないので)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1
参考URL:
http://support.microsoft.com/default.aspx?scid=kb;en-us;125614

関連するQ&A

  • CallNextHookEx( ) == FALSE

    1つのアプリの中で、メインプロージャとフックプロージャを作りました。 フックはキーボードフックです。 HHOOK hHook; LRESULT CALLBACK MyHookProc(int nCode, WPARAM wParam, LPARAM lParam){  if(nCode < 0)return CallNextHookEx(hHook, nCode, wParam, lParam);  if(wParam == 0x31)return FALSE;  return TRUE; } フックしていても 「ぬ」 のキーは使えるようにしました。  if(wParam == 0x31)return FALSE; は  if(wParam == 0x31)return CallNextHookEx(hHook, nCode, wParam, lParam); にしても違いが分かりませんでした。 return FALSE では、メッセージをキューから削除らしいけど、メインの プロージャで LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){  switch(msg){  case WM_KEYDOWN:   if(wParam == 0x31)MessageBox(hWnd, "メインプロージャから", "", MB_OK);  break; にしても、フックプロージヤの戻り値は CallNextHookEx( ) でも FALSE でも MessageBox() は表示されました。 CallNextHookEx( ) にした場合と FALSE にした場合、何が違うのか、 どういうソースなら違いを確かめられるのか教えてください。

  • VC++&グローバルフックについて質問です

    vc++2008,Windows Vistaの環境でプログラムを作成しています。 以下、aが押されたら、設定したhWndにWM_KEYDOWN,VK_LEFTのメッセージを送るプログラムのつもりで書きました。 http://www.shos.info/develop/cwin/tipswin.html#windows008 を参考にしています。 しかし、dllにしてWinMainで呼び出したのですが動作しません。 エラーも出ないのでなぜ動かないのかがわかりません。 このプログラムをちゃんと動かすにはどうしたらいいでしょうか。 どうかご指摘ください。よろしくお願いします。 //hook.h #ifdef HOOKAPI #else #define HOOKAPI extern "C" __declspec(dllimport) #endif HOOKAPI HINSTANCE _hInstance; HOOKAPI HHOOK _hHook; HOOKAPI HWND _hWnd; HOOKAPI BOOL Set(HWND hWnd); HOOKAPI void Reset(); //hook.cpp #include <windows.h> #define HOOKAPI extern "C" __declspec(dllexport) #include "hook.h" #pragma data_seg(".share") HHOOK _hHook = NULL; HWND _hWnd = NULL; HINSTANCE _hInstance; #pragma data_seg() #pragma comment(linker, "/section:.share,rws") LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) { /* ここでは 'A' が押されたら予め設定済みの _hWnd にメッセージを送る */ if (nCode >= 0 && nCode != HC_NOREMOVE && wParam == 'A') { PostMessage(_hWnd, WM_KEYDOWN, VK_LEFT, 0); CallNextHookEx(_hHook, nCode, wParam, lParam); return 1; } return CallNextHookEx(_hHook, nCode, wParam, lParam); } BOOL Set(HWND hWnd) { /* キーのフック */ _hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)HookProc, _hInstance, 0); /* ここで hInstance は DLL のインスタンス ハンドル */ _hWnd = hWnd; return (_hHook != NULL); } void Reset() { if (_hHook != NULL) { UnhookWindowsHookEx(_hHook); _hHook = NULL; } }

  • グローバルフックについて

    VC++6.0でグローバルフック用のDLLを作っていて、どうしてもわからないので質問させていただきます。 フックの内容は、ウィンドウが最前面にあるかどうか常に監視したいので、状態が変わるメッセージをフックしています。 フック対象はとあるゲームなんですが、テストのためにメモ帳を対象にテストをしました。 まず、spy++でウィンドウの状態を変化させたときに送られてくるメッセージを調べた結果。 WM_ACTIVATEが送られてくるので、これをフックしてみたのですが、spy++だとバックグラウンドに行った時、フォアグラウンドに行った時、最小化したとき、最小化から復帰したときにWM_ACTIVATEが送られてくるんですが、いざフックしてみると最小化するときと最小化から復帰したときにしかフックが作動しません。 spy++ではWM_SETFOCUSも送られてくるようだったので、そちらも試してみたのですが、まったく反応がありません。 逆に、spy++では検知してくれないWM_SHOWWINDOWではバックグラウンドに行った時、フォアグラウンドに行った時、最小化したとき、最小化から復帰したとき、すべてに反応してくれました。 このWM_SHOWWINDOWをフックしたときのようになれば問題無いのですが、フック対象をメモ帳からとあるゲームにしたときに、バックグラウンドに行った時と最小化したときは反応してくれたものの、フォアグラウンドに行った時と最小化から復帰したときは反応してくれません。 それと、WM_SHOWWINDOWのメッセージをフックした時のwparamの値なんですが、ネットで調べてみると 表示されようとしているとき 1 非表示されようとしているとき 0 となっているはずなのですが、自分のをみてみると常に647で固定されています。 どなたか解決策をご教授お願いします。 LRESULT CALLBACK WndProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode < 0) { return CallNextHookEx(hHook, nCode, wParam, lParam); } else if (nCode == HC_ACTION) { MSG *lmsg; lmsg = (MSG *)lParam; switch (lmsg->message){ case WM_SHOWWINDOW: MessageBox(NULL,"showwindow","info",MB_OK | MB_TOPMOST); return CallNextHookEx(hHook, nCode, wParam, lParam); break; } } return CallNextHookEx(hHook, nCode, wParam, lParam); }

  • キィーボードをフックしません、何故ですか???

    パソコンを現在人間が実際に操作中であるか否かを判定しながら進めるアプリを作っています 簡易的にキィーボードを操作していれば操作中と判断します(マウス操作も含めますが話を簡単にするため今はキィーだけとします) グローバルフックでKEY_DOWNをフックする為に以下のDLL(主要部分のみ)を作りました キィーが押されるとMW_KEYDOWN_DLLというメッセージをアプリに送ります EXPORT LRESULT CALLBACK HookProc( int nCode, WPARAM wParam, LPARAM lParam) { if(nCode == HC_ACTION) { CWPSTRUCT *pcwp = (CWPSTRUCT *)lParam; if(pcwp->message == WM_KEYDOWN) { SendMessage(g_hWnd, WM_KEYDOWN_DLL, pcwp->wParam, pcwp->lParam); ←(1) } } return (CallNextHookEx(g_hHook, nCode, wParam, lParam)); } MW_KEYDOWN_DLLメッセージを受けたアプリは操作中フラグを立てます(主要部分のみ) LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_KEYDOWN_DLL: ここで操作中フラグを立てます ←(2)  このフラグは一定時間後にタイマーが倒します break; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return (0L); } 実行してみると(1)に来ません、当然(2)のフラグは立ちません WM_KEYDOWNの代わりにWM_CREATE、WM_CLOSEだときちんとフックします WM_CHAR、MW_KEYUPなどのキィーボード系のメッセージだとフックしません なぜでしょうか??? 多分きわめて初歩的な知識の欠如によるものでしょうが分かりません 宜しくご指導願います

  • システムメニューのフック(SDK)

    はじめまして。 開いている全てのウィンドウのシステムメニューに 項目を追加するプログラムを作っているのですが、 例えばSC_TESTというIDの項目を追加して、 そのSC_TESTが押されたという判断はどうすればいいのかわかりません。 WH_CALLWNDPROCフックをしているのですが、 さすがに下のコードではSC_TESTの部分は動きません。 どの項目がクリックされたかまでは調べられないので しょうか? EXPORT LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp) { CWPSTRUCT *pcwp; char str[256]; if (nCode < 0) { return CallNextHookEx(hHook, nCode, wp, lp); } if (nCode == HC_ACTION) { if (wp == NULL) { pcwp = (CWPSTRUCT *)lp; switch(pcwp->message){ case WM_CLOSE: MessageBox(pcwp->hwnd, "CLOSE", "OK", MB_OK); break; case WM_CREATE: SetExtWindowEx(pcwp->hwnd); break; case SC_TEST: MessageBox(pcwp->hwnd,"AAA","AAA",MB_OK); break; default: break; } } } return CallNextHookEx(hHook, nCode, wp, lp); }

  • マウスフックについて

    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); }

  • なぜhButton1ボタンからのWM_COMMANDはフックできてクライアントエリアのWM_RBUTTONDOWNはフックできないのでしょうか?

    #define STRLBUTTON TEXT("マウス左ボタンが押されました from mainProc") #define STRRBUTTON TEXT("マウス右ボタンが押されました from my_HookProc") #define STRCOMMAND TEXT("ボタンが押されました") HWND hButton1; LRESULT CALLBACK my_HookProc(int nCode, WPARAM wParam, LPARAM lParam) { CWPRETSTRUCT *pcwpRetStruct = (CWPRETSTRUCT *)lParam; HDC hDC; if(nCode==HC_ACTION) { hDC = GetDC(pcwpRetStruct->hwnd); switch(pcwpRetStruct->message) { case WM_COMMAND: TextOut(hDC, 10, 10, STRCOMMAND, strlen(STRCOMMAND)); break; case WM_RBUTTONDOWN: TextOut(hDC, 10, 10, STRRBUTTON, strlen(STRRBUTTON)); break; } ReleaseDC(pcwpRetStruct->hwnd, hDC); } return CallNextHookEx(NULL, nCode, wParam, lParam); } LRESULT CALLBACK mainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static HHOOK hHook; HDC hDC; switch(uMsg) { case WM_DESTROY: UnhookWindowsHookEx(hHook); PostQuitMessage(0); return 0; case WM_CREATE: hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, my_HookProc, NULL, GetCurrentThreadId() ); if(!hHook) MessageBox(NULL, "hooking failed", NULL, MB_OK); hButton1 = CreateWindow( "BUTTON", "hButton1", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 40, 100, 20, hWnd, NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL ); return 0; case WM_LBUTTONDOWN: hDC = GetDC(hWnd); TextOut(hDC, 10, 10, STRLBUTTON, strlen(STRLBUTTON)); ReleaseDC(hWnd, hDC); return 0; } return DefWindowProc(hWnd, uMsg, wParam, lParam); }

  • キーボードフックの使い道

    dll のソースの一部です。 LRESULT CALLBACK MyHookProc(int nCode, WPARAM wParam, LPARAM lParam) {  if ( wParam == 0x31 )処理;  return CallNextHookEx(hHook, nCode, wParam, lParam); } 処理の部分では、MessageBox( ) とか MessageBeep( ) ぐらいしか 使えません。 「ぬ」 のキーが押されたら、メインのウインドウのエディットボックスの 文字を書き替えたりしたいんだけど、キーボードフックのプロージャの 中では、文字列の書き替えをすると、アプリケーションが強制終了します。 メモリマップドファイル、グローバルメモリの書き替えもやってみたけど キーボードフックのプロージャの中からはできませんでした。 dll の中なのに、キーボードフックのプロージャの中では 自分自身を LoadLibrary( ) して、GetProcAddress( ) とかしないと メモリの書き換えとかができないんですか? キーボードフックのプロージャの良い活用法を教えてください。

  • SetWindowsHookExで質問

    WindowsAPIの質問です。 hHook = SetWindowsHookEx( WH_CALLWNDPROCRET , (HOOKPROC)CallWndRetProc , hInsttance , 0 ) といった形で利用しています。 (hInsttance は自分自身。) CallWndRetProcですがMSDNでは nCode パラメータの値が 0 未満の場合、CallNextHookEx 関数を呼び出し、 nCode パラメータの値が 0 以上の場合も、CallNextHookEx 関数を呼び出し、その関数の戻り値を返すことを強く推奨します。 CallNextHookEx 関数を呼び出さない場合、0 を返すべきです。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpipc/html/_win32_callwndretproc.asp となっています。 しかし nCode == 0のとき、すなわちnCode == HC_ACTIONで CallNextHookExを呼び出すと、例外エラーがでた末、Windows自体が不安定になってしまいます。 nCode == HC_ACTIONのとき、return 0;にすれば問題はでないのですが なんだか気分的にスッキリしません。 ちなみに英語のドキュメントも読みましたがgreater than or equal to Zero となっており0を含むようでした。 LRESULT CALLBACK CallWndRetProc( int nCode, WPARAM wParam, LPARAM lParam ){ return CallNextHookEx( hHook, nCode , wParam , lParam ); } こんな感じで書くと強制終了してWindowsが不安定になってしまいます。

  • 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は無いようです。 どうすればいいのかご教授お願いします。

専門家に質問してみよう