C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: ホットキーの長押しを取得したい


(過去ログ 124 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■73830 / inTopicNo.1)  ホットキーの長押しを取得したい
  
□投稿者/ pod (23回)-(2014/11/07(Fri) 18:15:37)

分類:[C#] 

C# 2013 で特定のキーの押下状態を取得し、押したタイミングと離したタイミングでそれぞれ別の処理をしようと思います。
具体的にはホットキーが押されている間だけフォームを表示し、離したら非表示にするというものです。

タイマーを使って現在のキーの状態を取得しようと思い、次のようにしました。

int mod = 0x0002 | 0x0004; // Control + Shift
Keys key = Keys.A;

[DllImport("user32")]
static extern short GetAsyncKeyState(Keys vKey);

void Timer_Tick(object sender, EventArgs e)
{

if (GetAsyncKeyState(key) < 0 && (Control.ModifierKeys & mod) == mod){
// 押されている
} else {
// 押されていない
}

}

一応キーの状態は判別できているのですが、指定していない余分なキーが押されていた場合であっても押されたことになってしまいます。
例えば「Control+Shift+A」にのみ反応させるつもりが、「Control+Alt+Shift+A」のように、指定したキーが全て含まれてさえいれば反応しているようです。

指定したキーのみが押されている状態をどのように取得すればいいのでしょうか?
よろしくお願いします。
引用返信 編集キー/
■73831 / inTopicNo.2)  Re[1]: ホットキーの長押しを取得したい
□投稿者/ とっちゃん (270回)-(2014/11/07(Fri) 18:37:41)
とっちゃん さんの Web サイト
No73830 (pod さん) に返信

> 一応キーの状態は判別できているのですが、指定していない余分なキーが押されていた場合であっても押されたことになってしまいます。
> 例えば「Control+Shift+A」にのみ反応させるつもりが、「Control+Alt+Shift+A」のように、指定したキーが全て含まれてさえいれば反応しているようです。
>
Control.ModifiersKeys を、中途半端にマスクしてしまうのが原因です。
(Control.ModifierKeys & mod) == mod
とすると、Control.ModifierKeys を比較する前に比較したい項目だけでマスクしてしまうので
それ以外のキーが押されているかどうかが判定に含まれていません。

マスクせずに比較すれば判定できると思いますよ。

引用返信 編集キー/
■73832 / inTopicNo.3)  Re[2]: ホットキーの長押しを取得したい
□投稿者/ pod (24回)-(2014/11/07(Fri) 18:47:27)
No73831 (とっちゃん さん) に返信

> Control.ModifiersKeys を、中途半端にマスクしてしまうのが原因です。
> (Control.ModifierKeys & mod) == mod
> とすると、Control.ModifierKeys を比較する前に比較したい項目だけでマスクしてしまうので
> それ以外のキーが押されているかどうかが判定に含まれていません。

回答有難うございます。
教えていただいたように修正したら無事に動作しました。
ビット演算に関する知識が足りていなかったので助かりました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -