• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:windows2000 フックについて)

Windows2000 フックについて

このQ&Aのポイント
  • Windows2000のフックとは何ですか?キーボード操作を制限する方法について教えてください。
  • Windows2000のフックをDLL化してVBで呼び出したいですが、エラーが出てうまくいきません。キーボードプロシージャを作成し、KBDLLHOOKSTRUCTの宣言にエラーが出ます。
  • 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

関連するQ&A

専門家に質問してみよう