[編輯3] 我有種「解決它」在使用「奇怪的」版本。至少對於最重要的按鍵。這對我的情況很有幫助,我想檢查ALT和ALT + A是否不相同(從而確保A未被按下)。不完美,但已經花了很多時間處理這樣一個小問題。感謝反正... [編輯3]檢測是否有任何按鍵在C#(不是A,B,但任何)
[編輯4]解決它更清潔感謝280Z28 [/ EDIT 4]
我知道如何檢查修改鍵以及如何將所有的答案測試一個密鑰。 問題是,我想檢查是否有任何按鍵被按下。下面的方法似乎是「奇怪」 :-)
WPF在C#編寫
if (Keyboard.IsKeyDown(Key.A)) return true;
if (Keyboard.IsKeyDown(Key.B)) return true;
if (Keyboard.IsKeyDown(Key.C)) return true;
我知道這是一個枚舉應用程序,所以我想到了一個循環,但什麼是「最大號」使用。這可能嗎?順便說一句,它是一個非常特殊的情況,通常我會使用一個事件,但在這種情況下,我必須這樣做。不幸的是,沒有「列表」Keyboard.CurrentlyDownKeys。至少我沒有看到它。
謝謝, 克里斯
編輯:好的,因爲它似乎是一個更大的交易,在這裏這樣做的原因: 我已經定義了一個「密鑰集」充當DictionaryKey自定義功能。如果任何人點擊一個元素,包裝器遍歷字典並檢查是否有任何預定義的「Keysets」是活動的。
這使我可以定義簡單的觸發器,例如,如果按下ALT + A + B,則運行此功能。另一個選擇是例如如果按下ALT + STRG + A(在鼠標點擊WPF元素期間),請運行此功能。
當前實現的唯一「問題」,如果我定義不包含任何REAL鍵的鍵集,如按下ALT鍵時運行,如果按下ALT + A鍵,也會觸發它。哦,在寫這篇文章的時候,我意識到還有另外一個問題。如果按下ALT + A + B + C,ALT + A + B也會觸發。
也許我的方法是錯誤的,我應該創建一個「靜態鍵跟蹤器」,並將鍵集與它的值進行比較(通過事件獲得)。我會試試這個。
EDIT 2 這是行不通的,至少不是以簡單的方式。我需要一個FrameworkElement來綁定到KeyDown,但我沒有在靜態構造函數中使用它。我對某個元素的KeyDownEvents不感興趣,但是「全局」......我想我會推遲這個問題,這並不重要。不過,如果有人知道了不同的方法更好?
長期如此,對任何人誰在乎,這裏的一些代碼:
public class KeyModifierSet
{
internal readonly HashSet<Key> Keys = new HashSet<Key>();
internal readonly HashSet<ModifierKeys> MKeys = new HashSet<ModifierKeys>();
public override int GetHashCode()
{
int hash = Keys.Count + MKeys.Count;
foreach (var t in Keys)
{
hash *= 17;
hash = hash + t.GetHashCode();
}
foreach (var t in MKeys)
{
hash *= 19;
hash = hash + t.GetHashCode();
}
return hash;
}
public override bool Equals(object obj)
{
return Equals(obj as KeyModifierSet);
}
public bool Equals(KeyModifierSet other)
{
// Check for null
if (ReferenceEquals(other, null))
return false;
// Check for same reference
if (ReferenceEquals(this, other))
return true;
// Check for same Id and same Values
return Keys.SetEquals(other.Keys) && MKeys.SetEquals(other.MKeys);
}
public bool IsActive()
{
foreach (var k in Keys)
if (Keyboard.IsKeyUp(k)) return false;
if ((Keys.Count == 0) && !Keyboard.IsKeyDown(Key.None)) return false;
foreach (var k in MKeys)
if ((Keyboard.Modifiers & k) == 0) return false;
if ((MKeys.Count == 0) && Keyboard.Modifiers > 0) return false;
return true;
}
public KeyModifierSet(ModifierKeys mKey)
{
MKeys.Add(mKey);
}
public KeyModifierSet()
{
}
public KeyModifierSet(Key key)
{
Keys.Add(key);
}
public KeyModifierSet(Key key, ModifierKeys mKey)
{
Keys.Add(key);
MKeys.Add(mKey);
}
public KeyModifierSet Add(Key key)
{
Keys.Add(key);
return this;
}
public KeyModifierSet Add(ModifierKeys key)
{
MKeys.Add(key);
return this;
}
}
你的應用程序是什麼?安慰? Windows窗體? WPF?網站? – jrista 2009-11-17 23:10:45
請參閱標題... .NET C# – 2009-11-17 23:18:52
這沒有幫助。 – 2009-11-17 23:22:44