掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
キーボードフォーカス有無を判定するには? (ID:73655)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
立て続けの質問になってしまい、申し訳ございません。 常駐アプリで、エクスプローラのリストビューにフォーカス(キーボードフォーカス)があるときだけキーのフックを行いたいのですが、 以下の関数をタイマー(100ms)で実行するとエクスプローラでマウスの ダブルクリックが動作しなくなってしまいます。 下記のHPで対処された方がいますが、どちらもアクティブウィンドウが切り替わった時だけ「AttachThreadInput」をコールするというものでした。 (今回は同じエクスプローラのウィンドウ内でも、アドレス欄にキーボードフォーカスがある時はフックをしない様にしたいです。 タイマーの間隔を延ばすとダブルクリックが発生しなくなる確率は減りますが、 根本的な解決になっていないと思います。 アドバイスお願いします。 void CaaaDlg::OnTimer(UINT nIDEvent) { // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください KillTimer(10); // エクスプローラか? if (IsHookWindow(::GetForegroundWindow()) == TRUE) { // フック開始 } else { // フック終了 } SetTimer(10, 100, NULL); CDialog::OnTimer(nIDEvent); } BOOL CaaaDlg::IsHookWindow(HWND hWnd) { CString clsName; char buffer[80]; int len; BOOL bRet = FALSE; memset(buffer, 0, sizeof(buffer)); len = ::GetClassName(hWnd, buffer, 80); //アクティブなウィンドウ名 if (len > 0) { // Win+Eで開いたウィンドウとマイコンピュータから開いたウィンドウでクラス名が違う if ((strcmp(buffer, "CabinetWClass") == 0) || (strcmp(buffer, "ExploreWClass") == 0)) { // エクスプローラ内のフォーカスがあるウィンドウハンドルを取得 DWORD ActiveProcessID, ActiveThreadID; ActiveThreadID = ::GetWindowThreadProcessId(hWnd, &ActiveProcessID); if (::AttachThreadInput(::GetCurrentThreadId(), ActiveThreadID, TRUE)) { // キーボードフォーカスがあるウィンドウハンドル取得 HWND tmpWnd = ::GetFocus(); ::AttachThreadInput(::GetCurrentThreadId(), ActiveThreadID, FALSE); memset(buffer, 0, sizeof(buffer)); len = ::GetClassName(tmpWnd, buffer, 80); //アクティブなウィンドウ名 if (len > 0) { if (strcmp(buffer, "SysListView32") == 0) { // フック対象ウィンドウ bRet = TRUE; } } } } else { bRet = FALSE; } } return bRet; } 環境はVC6(MFC)です。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.