VC++2005環境でのグローバルフックについて質問です。
初めてグローバルフックを使用してみようといろいろ調べて参考にしてみましたが、どう
しても作成したEXEのウィンドウが動作した場合でしかコールバック関数に処理が飛んで
きません。
参考にしたソースはVC++6で書かれていましたが、VC++2005と何か違いがあるのでしょう
か?WH_WH_MOUSE_LLを指定した場合は、うまくいってるようですが、WH_CALLWNDPROCを指
定すると電卓などを起動しても、なにも反応しませんでした。
おおまかな処理は下記のとおりです。よろしくお願いします。
//////////DLL//////////
//共有領域
#pragma data_seg(.sharedata)
HHOOK hHookWnd=0;
#pragma data_seg()
HINSTANCE hdll;
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if(ul_reason_for_call==DLL_PROCESS_ATTACH){
hdll=hModule; // DLLハンドルを保存
}
return TRUE;
}
LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode==HC_ACTION){
if(((CWPSTRUCT *)lParam)->message==WM_CREATE){
…
}
}
return CallNextHookEx(hHookWnd, nCode, wParam, lParam); //次のフックを呼ぶ
}
//フックを組み込む
void CALLBACK starthook(void)
{
hHookWnd=SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc, hdll, 0);
//hHookWnd=SetWindowsHookEx(WH_WH_MOUSE_LL,CallWndProc, hdll, 0);
}
//フックを解除する
void CALLBACK endhook(void)
{
UnhookWindowsHookEx(hHookWnd);
}
////////EXE/////////////
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
…
starthook(); //フックを組み込みます
// メイン メッセージ ループ:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
endhook(); //フックを解除します。
return (int) msg.wParam;
}
////////DEFファイル/////////////
LIBRARY
SECTIONS
.sharedata READ WRITE SHARED
セクション名(.sharedata)を、ピリオド込みで(必ずしもピリオドで始まる必要は
ありませんが)8文字以下にしてみるとどうでしょうか?
動作試験は、debugモードでやってますか?
それとも、Releaseでビルドして、単体起動でやってますか?
ご回答ありがとうございます。
動作試験は、debugモードでやってます。
セッション名を8文字以下にしてみましたが、動作しませんでした。
共有セクションの属性はセットしていますか?
#pragma data_seg()の後に以下の行追加でもOKです。
#pragma comment(linker, /sectionN:.shared,rws)
Releaseでビルドで動作したら問題ありませんでした。
ありがとうございます。