教えてください。
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化やフックについていろいろ調べたのですが、初めてのため、可笑しい個所があるかとは思いますが、すみませんが教えてください。よろしくお願いします。
No.7ベストアンサー
- 回答日時:
>私がつまずいたのは、#define _WIN32_WINNT 0x0400
>でした。
軽くここに書いてありますね。
http://www.kumei.ne.jp/c_lang/sdk3/sdk_264.htm
ちゃんとはここに。
http://msdn.microsoft.com/library/default.asp?ur …
ようは、OSやIEのバージョンごとに使用可能なAPIなどが違うんで、ターゲットのOSを決めてねということです。
>ヘッダーの中を見ていましたが、#ifとかの意味がわからなかったと言うのもありましたし、
>リンクだけしていればOKという勘違いもしていました。
#ifなどは、プリプロセッサ命令といいます。
http://www.shibu.jp/cppreference/preproc_details …
#参考url入れてますけど、VC++付属のヘルプのほうに、みんなちゃんと書いてありますんで。
No.6
- 回答日時:
>VC++6発売時点でなかったものについては、当然定義はヘッダ中に存在しません。
うそ書いちゃいました。ごめんなさい。
失礼しました。VC++付属のヘッダに定義されてましたね。
NT4.0SP3以降ってことはVC6++発売前でした。
>VC++付属のものと、インストールしたSDK付属のものの違いを自分で確認してみてください。
ほとんど内容変わってませんね。
まぁ、エラーになる理由はヘッダファイル見ればわかると思うんで、見てみてください。
ありがとうございました。
>うそ書いちゃいました。ごめんなさい。
大丈夫です。一様確認してましたので気づきました。
私がつまずいたのは、#define _WIN32_WINNT 0x0400
でした。
よくわからなかったです。
ヘッダーの中を見ていましたが、#ifとかの意味がわからなかったと言うのもありましたし、リンクだけしていればOKという勘違いもしていました。
#define _WIN32_WINNT 0x0400 の記述理由がいまいちわからないのですが・・・・勉強するしかないですね。わかったのはヘッターにある条件文で使用すると言うことだけです。
ALT+TAB、CTRL + ESC、ALT+ESC、windowsmenu等のキーを制御することは出来ました。
とても勉強になりました。本当にありがとうございました。VC++は奥が深いです。
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付属のものの違いを自分で確認してみてください。
そうすれば、なぜだめだったのかも理解できると思います。
No.4
- 回答日時:
>SDKをコピーして、
http://www.microsoft.com/japan/msdn/windows/wind …>をにあるソースを実行させました。ですが、問題が出ます。
コピーってインストールのことですよね?
インストール後に、ヘッダファイルやLibファイルの場所をVC++に指定させる作業はしましたか?
VC++のツールのメニューから設定できますし、
スタートメニューに追加されたのSDKの、「Visual Studio Registration」にある「Register PSDK Directories with Visual Studio」を実行すれば設定してくれます。
この回答への補足
ありがとうございます。
>コピーってインストールのことですよね?
>インストール後に、ヘッダファイルやLibファイルの場>所をVC++に指定させる作業はしましたか?
>VC++のツールのメニューから設定できますし、
>スタートメニューに追加されたのSDKの、「Visual >Studio Registration」にある「Register PSDK >Directories with Visual Studio」を実行すれば設定 >してくれます。
両方試したのですが、うまくいきませんでした。
WH_KEYBOARDは認識できて、WH_KEYBOARD_LLは定義されていない識別子と出るのはおかしいですよね。
同じwin32のSetWindowsHookExにあるものですよね?
win32のDLLがおかしいのでしょうか?
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/wind …
ということで、以下のことは関係なくなってしまいますが、一応。
>一様バグがありますが、VK_TABを認識はしています。 ただ、無効に出来ていません。
無効にするにはどうしたらよろしいのでしょうか。
HC_NOREMOVEを何で処理していないんですか?
この回答への補足
遅くなって申し訳ありません。
SDKをダウンロードしたり、いろいろ試していたりして遅くなりました。
SDKをコピーして、http://www.microsoft.com/japan/msdn/windows/wind …
をにあるソースを実行させました。ですが、問題が出ます。
error C2065 WH_KEYBOARD_LLとKBDLLHOOKSTRUCTが定義されていない識別子です。と出るのです。
ただ、winuser.hは認識しているみたいなのですが・・・・(pkbdllhook->vkCodeはメソッド表示されるので)
WH_KEYBOARD_LLとKBDLLHOOKSTRUCTを定義する場所がおかしいのでしょうか?それとも他に設定があるのでしょうか?
ご存知の方申し訳ありませんが、教えてください。
No.2
- 回答日時:
#1の方法ですと、Ctrl+ESCはだめですね。
エクスプローラにHotkey登録されちゃってるようです。
まぁ、これは特殊なキー操作じゃないんで普通にフックできると思いますんで。
で、
>まず、はじめにKeyboardProcを作成したのですが、KBDLLHOOKSTRUCTが宣言されていないとでます。
VC++6発売時点でなかったものについては、当然定義はヘッダ中に存在しません。
最新のSDKをダウンロードしてインストールしてください。
http://www.microsoft.com/msdownload/platformsdk/ …
参考URL:http://www.microsoft.com/msdownload/platformsdk/ …
この回答への補足
//ヘッダー
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 等なんですが、よくわからないので)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- JavaScript JAVASCRIPT 2 2022/04/15 15:10
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Comctl32.dllの配布
-
Microsoft Visual C++ をアンイ...
-
exeファイルのアンインストール...
-
mscorlib.dllの初回例外について
-
VB.NETで参照設定したDLLの修正...
-
Userform内のFrameのCaptionが...
-
Visual Studio 有料と無料比較
-
Designer.vbは直接コードをいじ...
-
VBSでExcelファイル印刷時のプ...
-
VBSでExcelのUserFormをエクス...
-
Visual Studio 「AnyCpu」について
-
VC++6.0 で 16bit アプリケーシ...
-
意味不明の実行時エラーで困っ...
-
C++初心者です。 debug asserti...
-
ご存知の方がいましたら教えて...
-
byte型をstring型として扱うには
-
C++の統合開発環境について
-
Web(?)からのリクエストに応じ...
-
アウトルックが起動しているか...
-
VBScriptでエクセル印刷モード起動
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでArrayListを使う為の「msc...
-
VB6(SP5)+OO4OでCreateObjectが...
-
[VB.net] ExcelへのQRコード出...
-
VB.NETでSPREADの設定方法
-
う~ん…。
-
Product Codeの変更法は?
-
発行元:不明???
-
次のクラスは登録されていませ...
-
ビルドした.exeファイルは.NE...
-
ListViewで文字化けしてしまい...
-
MSDNのセットアップ方法(ヘル...
-
VB6.0で作成したexeファイルが...
-
VB6で作成したアプリを配布する...
-
VB.NET で作られたソフト...
-
VB.NET(2017)で インストーラを...
-
OLEPRO32.DLLが見つかりません
-
accessがインストールされてい...
-
Excel 12.0とExcel 10.0両方を...
-
Excelがインストールされてない...
-
VB6のアプリケーションの配布
おすすめ情報