でWindowsフォーム、あなたは、いつでも、カーソルのおかげで現在の位置を知ることができるカーソルのクラスを。
同じことがキーボードで利用できないようです。たとえば、Shiftキーが押されたかどうかを知ることはできますか?
すべてのキーボード通知(KeyDownおよびKeyUpイベント)を追跡することは絶対に必要ですか?
でWindowsフォーム、あなたは、いつでも、カーソルのおかげで現在の位置を知ることができるカーソルのクラスを。
同じことがキーボードで利用できないようです。たとえば、Shiftキーが押されたかどうかを知ることはできますか?
すべてのキーボード通知(KeyDownおよびKeyUpイベント)を追跡することは絶対に必要ですか?
回答:
if ((Control.ModifierKeys & Keys.Shift) != 0)
Ctrl+ Shiftがダウンしている場合も同様です。Shiftだけが押されているかどうかを確認したい場合は、
if (Control.ModifierKeys == Keys.Shift)
継承するクラスControl
(フォームなど)を使用している場合は、Control.
GetKeyState
API関数を呼び出す必要があります。
Keyboard.Modifiers == ModifierKeys.Shift
(検索にここに来たもののために)
(Control.ModifierKeys & Keys.Shift) != 0
使用できますControl.ModifierKeys.HasFlag(Keys.Shift)
以下のコードは、Shiftキーだけでなく、現在押されているほぼすべてのキーを検出する方法です。
private KeyMessageFilter m_filter = new KeyMessageFilter();
private void Form1_Load(object sender, EventArgs e)
{
Application.AddMessageFilter(m_filter);
}
public class KeyMessageFilter : IMessageFilter
{
private const int WM_KEYDOWN = 0x0100;
private const int WM_KEYUP = 0x0101;
private bool m_keyPressed = false;
private Dictionary<Keys, bool> m_keyTable = new Dictionary<Keys, bool>();
public Dictionary<Keys, bool> KeyTable
{
get { return m_keyTable; }
private set { m_keyTable = value; }
}
public bool IsKeyPressed()
{
return m_keyPressed;
}
public bool IsKeyPressed(Keys k)
{
bool pressed = false;
if (KeyTable.TryGetValue(k, out pressed))
{
return pressed;
}
return false;
}
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == WM_KEYDOWN)
{
KeyTable[(Keys)m.WParam] = true;
m_keyPressed = true;
}
if (m.Msg == WM_KEYUP)
{
KeyTable[(Keys)m.WParam] = false;
m_keyPressed = false;
}
return false;
}
}
GetKeyState
より効率的です。Windowsが既に行っている場合、すべてのキーを追跡しても意味がありません。
System.Windows.Inputを参照すると、以下も確認できます。
if (Keyboard.Modifiers == ModifierKeys.Shift)
Keyboard名前空間は、Keyboard.IsKeyDown(Key)を使用して他のキーの押された状態を確認するためにも使用できます。または、KeyDownEventまたは同様のイベントをサブスクライブしている場合、イベント引数は現在押されているキーのリストを保持します。
これらの答えのほとんどは、非常に複雑であるか、私にはうまくいかないようです(たとえば、System.Windows.Inputが存在しないようです)。次に、正常に動作するサンプルコードをいくつか見つけました:http : //www.switchonthecode.com/tutorials/winforms-accessing-mouse-and-keyboard-state
今後ページが表示されなくなる場合は、以下の関連するソースコードを投稿します。
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace MouseKeyboardStateTest
{
public abstract class Keyboard
{
[Flags]
private enum KeyStates
{
None = 0,
Down = 1,
Toggled = 2
}
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern short GetKeyState(int keyCode);
private static KeyStates GetKeyState(Keys key)
{
KeyStates state = KeyStates.None;
short retVal = GetKeyState((int)key);
//If the high-order bit is 1, the key is down
//otherwise, it is up.
if ((retVal & 0x8000) == 0x8000)
state |= KeyStates.Down;
//If the low-order bit is 1, the key is toggled.
if ((retVal & 1) == 1)
state |= KeyStates.Toggled;
return state;
}
public static bool IsKeyDown(Keys key)
{
return KeyStates.Down == (GetKeyState(key) & KeyStates.Down);
}
public static bool IsKeyToggled(Keys key)
{
return KeyStates.Toggled == (GetKeyState(key) & KeyStates.Toggled);
}
}
}
System.Windows.Input
存在する; これに苦労している他の人にとっては、への参照とPresentationCore
、列挙WindowsBase
にアクセスするための追加の参照を追加する必要がありSystem.Windows.Input.Key
ます。この情報は常にMSDNにあります。
static
ではないはずabstract
です。
.NET Frameworkバージョン3.0以降ではKeyboard.IsKeyDown
、新しいSystem.Windows.Input
名前空間のメソッドを使用できます。例えば:
if (((Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) && Keyboard.IsKeyDown(Key.F))
{
// CTRL + F is currently pressed
}
これはWPFの一部ですが、WinFormアプリケーションでは正常に機能します(PresentationCore.dllおよびWindowsBase.dllへの参照を追加した場合)。ただし、残念ながら、Keyboard.IsKeyDown
メソッドの3.0および3.5バージョンはWinFormアプリケーションでは機能しませんでした。したがって、WinFormアプリケーションで使用する場合は、.NET Framework 4.0以降をターゲットにして機能させる必要があります。
Keyboard.IsKeyDown
ありますが、WinFormプロジェクトでもメソッドは機能します。
次のことが可能P /呼び出しは、 Win32のにダウンGetAsyncKeyStateキーボードの任意のキーをテストします。
Keys列挙型(Keys.Shiftなど)からこの関数に値を渡すことができるため、追加するのに数行のコードしか必要ありません。
Keyboard
コンパイラによって認識されませんでしたがGetAsyncKeystate
、user32 では問題なく動作しました。ありがとう!
Windowsフォームフォームでキーボード入力を管理するために私が見つけた最良の方法は、キーストロークの後、フォーカスされたコントロールがイベントを受け取る前にそれを処理することです。Microsoftは、.KeyPreviewForm
という名前の組み込みレベルのプロパティを維持して、この正確なことを容易にしています。
public frmForm()
{
// ...
frmForm.KeyPreview = true;
// ...
}
次に、フォームの_KeyDown、_KeyPress、および/または_KeyUpイベントをマーシャリングして、フォーカスされたフォームコントロールに表示される前に入力イベントにアクセスし、ハンドラーロジックを適用してイベントをそこにキャプチャするか、フォーカスされたフォームコントロールにパススルーさせることができます。 。
XAMLのイベントルーティングアーキテクチャほど構造的に優雅ではありませんが、Winformsでのフォームレベルの関数の管理がはるかに簡単になります。警告については、KeyPreviewのMSDNノートを参照してください。
WinFormsの場合:
if( Form.ModifierKeys == Keys.Shift )
Windowsフォームでイベントを使用せずにスタックオーバーフローの質問の検出シフトキーが押されたように聞こえますか?。