トップページ > プログラム > 2015年05月13日 > jTT2yS9m

書き込み順位&時間帯一覧

3 位/213 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000010111201000007



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
349
Win32API質問箱 Build120©2ch.net

書き込みレス一覧

Win32API質問箱 Build120©2ch.net
342 :デフォルトの名無しさん[sage]:2015/05/13(水) 11:46:47.39 ID:jTT2yS9m
キーボード(ALT+TABなど)・マウス操作などで、ウインドがアクティブになった瞬間での、メインウインドがどれかを調べたいです。
GetForegroundWindowで取得するhWndですが、GetForegroundWindowを使わずにグローバルフックで処理したい場合、
どのようにすればよいでしょうか?
試しに、WM_ACTIVEを拾って、表示してみたのですが、同様のメッセージが複数送られて来て判断がつきません。
Win32API質問箱 Build120©2ch.net
345 :デフォルトの名無しさん[sage]:2015/05/13(水) 13:27:42.36 ID:jTT2yS9m
>>343
ログ見る限り、うまく動いてませんね。。
// Dll
HWND hookWnd(){return ghookWnd;}
LRESULT CALLBACK fix32HookProc(int nCode, WPARAM wParam, LPARAM lParam){
if ( nCode < 0 ) return CallNextHookEx(hHook, nCode, wParam, lParam);
CWPSTRUCT* const p = (CWPSTRUCT*)lParam;
case WM_ACTIVE:
ghookWnd=p->hwnd;
SendMessage(gMainWnd,WM_USER,p->wParam,p->lParam);
break;
-------------------------------
// main
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
switch(message){case WM_USER:
switch(LOWORD(wParam)){
case WA_ACTIVE: printf("%p WA_ACTIVE マウスクリック以外の方法でアクティブ化された %p\n",hookWnd(),(HWND)lParam); break;
case WA_CLICKACTIVE: printf("%p WA_CLICKACTIVE マウスクリックによってアクティブ化された %p\n",hookWnd(),(HWND)lParam); break;
case WA_INACTIVE: printf("%p WA_INACTIVE 非アクティブ化された(新しいハンドル%p)\n",hookWnd(),(HWND)lParam); break;
}
printf("GetForegroundWindow() %p\n",GetForegroundWindow());
}
GetForegroundWindow()の値とhookWnd(),(HWND)lParamの値が一致しないです。
WA_INACTIVEのとき、lParamには適正値が入るのは知ってます。
DLLのグローバルフック上のcase WM_ACTIVE:で、GetForegroundWindow()を呼び出してそれ使ったほうがよい?
Win32API質問箱 Build120©2ch.net
349 :デフォルトの名無しさん[sage]:2015/05/13(水) 14:41:26.04 ID:jTT2yS9m
>>348
ありがとう。試してみますね。
Win32API質問箱 Build120©2ch.net
350 :349[sage]:2015/05/13(水) 15:05:15.31 ID:jTT2yS9m
>>348
試しましたが、デバッグ用のコンソールのウインドがアクティブになった場合、
そのウインドのイベントが発生せず。。うーん。。WH_CALLWNDPROCでフックして、WM_ACITVE内で、
GetForegroundWindow()使ったほうがいいのかもしれないorz
Win32API質問箱 Build120©2ch.net
351 :349[sage]:2015/05/13(水) 16:23:00.40 ID:jTT2yS9m
開発環境が、64bit版のWin7で32ビットベースアプリでコンパイルしていたので、気が付きませんでしたが、
WIN8の32ビット版では、正しくHSHELL_WINDOWACTIVATEDは、GetForegroundWindow()の値と同じものが取得できました。
32Bit側のアプリ呼び出しの、AllocConsole();が、64BitOSだと、64Bitで動いていた可能性あり?
64BitDLL作って、調べてみます。
Win32API質問箱 Build120©2ch.net
352 :349[sage]:2015/05/13(水) 16:44:23.87 ID:jTT2yS9m
64BIT版フックのDLL作って調べました。予想通り、AllocConsole()の窓は、64Bitウインドでした。
Win32API質問箱 Build120©2ch.net
356 :デフォルトの名無しさん[sage]:2015/05/13(水) 18:45:24.92 ID:jTT2yS9m
マルウェア?だと?!


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。