dポイントプレゼントキャンペーン実施中!

教えてください。

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化やフックについていろいろ調べたのですが、初めてのため、可笑しい個所があるかとは思いますが、すみませんが教えてください。よろしくお願いします。

A 回答 (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++付属のヘルプのほうに、みんなちゃんと書いてありますんで。
    • good
    • 0

>VC++6発売時点でなかったものについては、当然定義はヘッダ中に存在しません。



うそ書いちゃいました。ごめんなさい。
失礼しました。VC++付属のヘッダに定義されてましたね。
NT4.0SP3以降ってことはVC6++発売前でした。


>VC++付属のものと、インストールしたSDK付属のものの違いを自分で確認してみてください。

ほとんど内容変わってませんね。

まぁ、エラーになる理由はヘッダファイル見ればわかると思うんで、見てみてください。
    • good
    • 0
この回答へのお礼

ありがとうございました。

>うそ書いちゃいました。ごめんなさい。
大丈夫です。一様確認してましたので気づきました。

私がつまずいたのは、#define _WIN32_WINNT 0x0400
でした。
よくわからなかったです。
ヘッダーの中を見ていましたが、#ifとかの意味がわからなかったと言うのもありましたし、リンクだけしていればOKという勘違いもしていました。
#define _WIN32_WINNT 0x0400 の記述理由がいまいちわからないのですが・・・・勉強するしかないですね。わかったのはヘッターにある条件文で使用すると言うことだけです。

ALT+TAB、CTRL + ESC、ALT+ESC、windowsmenu等のキーを制御することは出来ました。

とても勉強になりました。本当にありがとうございました。VC++は奥が深いです。

お礼日時:2005/03/29 23:51

ソースの先頭(#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付属のものの違いを自分で確認してみてください。

そうすれば、なぜだめだったのかも理解できると思います。
    • good
    • 0

>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がおかしいのでしょうか?

補足日時:2005/03/29 11:50
    • good
    • 0

>とりあえず今回は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を定義する場所がおかしいのでしょうか?それとも他に設定があるのでしょうか?

ご存知の方申し訳ありませんが、教えてください。

補足日時:2005/03/28 22:28
    • good
    • 0

#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 等なんですが、よくわからないので)

補足日時:2005/03/24 20:41
    • good
    • 0
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!