[EDIT 3] Tôi đã "giải quyết" bằng cách sử dụng phiên bản "lạ". Ít nhất là cho các phím quan trọng nhất. Nó là đủ cho trường hợp của tôi, nơi tôi muốn kiểm tra ALT và ALT + A không giống nhau (do đó đảm bảo A không được nhấn). Không hoàn hảo, nhưng đã có nhiều thời gian cho một vấn đề nhỏ như vậy. Cảm ơn tất cả các câu trả lời anyway ... [EDIT 3]Phát hiện nếu có phím nào được nhấn trong C# (không phải A, B, nhưng bất kỳ)
[EDIT 4] Giải quyết nó sạch hơn nhiều nhờ vào 280Z28 [/ EDIT 4]
tôi biết làm thế nào để kiểm tra các phím modifier và làm thế nào để kiểm tra một khóa duy nhất. Vấn đề là, tôi muốn kiểm tra xem có phím nào được nhấn hay không. Các phương pháp sau đây có vẻ "kỳ lạ" :-)
WPF Application viết bằng C#
if (Keyboard.IsKeyDown(Key.A)) return true;
if (Keyboard.IsKeyDown(Key.B)) return true;
if (Keyboard.IsKeyDown(Key.C)) return true;
Tôi biết nó là một enum, vì vậy tôi nghĩ về một vòng lặp, nhưng "số lớn nhất" là gì để sử dụng. Và điều này có thể? btw, một trường hợp rất đặc biệt của nó, thông thường tôi sẽ sử dụng một sự kiện, nhưng trong trường hợp này tôi phải làm theo cách này. Thật không may, không có "danh sách" Keyboard.CurrentlyDownKeys. Ít nhất tôi đã không nhìn thấy nó.
Cảm ơn, Chris
EDIT: Ok, vì nó có vẻ là một thỏa thuận lớn hơn, đây là lý do cho việc này: tôi đã xác định một "keyset" phục vụ như là DictionaryKey cho các chức năng tùy chỉnh. Nếu ai đó nhấp vào một phần tử, trình bao bọc sẽ lặp lại thông qua từ điển và kiểm tra xem có bất kỳ "Keysets" được xác định trước nào đang hoạt động hay không.
Điều này cho phép tôi xác định các trình kích hoạt đơn giản, ví dụ: ví dụ: Chạy chức năng này nếu nhấn ALT + A + B. Một tùy chọn khác là ví dụ: Chạy chức năng này nếu nhấn ALT + STRG + A (trong khi nhấp chuột vào phần tử WPF).
Chỉ "vấn đề" với việc triển khai hiện tại, nếu tôi xác định một Keyset không chứa bất kỳ phím REAL nào, như chạy nếu ALT được nhấn, nó cũng được kích hoạt nếu ALT + A được nhấn. Ồ, trong khi viết điều này, tôi nhận ra rằng có một vấn đề khác. ALT + A + B hiện cũng sẽ kích hoạt nếu ALT + A + B + C được nhấn.
Có lẽ cách tiếp cận của tôi là sai và tôi nên tạo "trình theo dõi khóa tĩnh" và so sánh keyset với giá trị của nó (được thu thập thông qua sự kiện) .. Tôi sẽ thử.
CHỈNH SỬA 2 Điều này không hoạt động, ít nhất là không theo cách đơn giản. Tôi cần một FrameworkElement để đính kèm vào KeyDown, nhưng tôi không có nó trong một constructor tĩnh. Và tôi không quan tâm đến KeyDownEvents của một yếu tố nhất định, nhưng "toàn cầu" ... Tôi nghĩ rằng tôi đã trì hoãn vấn đề này, nó không quan trọng. Tuy nhiên, nếu ai biết một tốt hơn về cách tiếp cận khác nhau ...
Chừng nào, cho bất cứ ai quan tâm, ở đây một số mã:
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;
}
}
Đơn đăng ký của bạn là gì? Console? Windows Forms? WPF? Trang mạng? – jrista
Xem tiêu đề ... .NET C# –
Điều đó không hữu ích. –