キィーボードをフックしません、何故ですか???
パソコンを現在人間が実際に操作中であるか否かを判定しながら進めるアプリを作っています
簡易的にキィーボードを操作していれば操作中と判断します(マウス操作も含めますが話を簡単にするため今はキィーだけとします)
グローバルフックで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などのキィーボード系のメッセージだとフックしません
なぜでしょうか???
多分きわめて初歩的な知識の欠如によるものでしょうが分かりません
宜しくご指導願います
お礼
なかなか回答がつかない中、回答ありがとうございます。 しかし、ユーザーが図形を新規作成した際にイベントが発生しないので、図形作成後にセル選択などをしないと新規図形を検知できないです。。。 ループ処理でCPUが変わるか見てみましたが、sleep 50くらいにするとほとんど使用しないようです。無駄なループは翻訳してイベント待ちになっているのかもしれません。VBAは謎が多い言語(コンパイラ?)ですので。。