Tôi cần có khả năng phát hiện rằng phím shift đang được giữ, nhưng tôi không muốn sử dụng sự kiện hoặc biến toàn cầu để xác định điều đó. Có một API trong C# cho phép bạn hỏi những phím nào hiện đang được nhấn thay vì sử dụng sự kiện?Phát hiện phím Shift được nhấn mà không sử dụng các sự kiện trong Windows Forms?
Trả lời
Không chắc chắn nếu điều này có sẵn trong C# nhưng bạn có thể gọi GetAsyncKeyState. Phương thức này trả về trạng thái của một khóa tại thời điểm mà phương thức được gọi.
Để gọi từ C#, bạn cần sử dụng interop giống như bất kỳ API Win32 nào khác.
Form.ModifierKeys
(thuộc tính tĩnh)
Bạn có thể cài đặt một low-level keyboard hook.
using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;
class InterceptKeys
{
private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
private static LowLevelKeyboardProc _proc = HookCallback;
private static IntPtr _hookID = IntPtr.Zero;
public static void Main()
{
_hookID = SetHook(_proc);
Application.Run();
UnhookWindowsHookEx(_hookID);
}
private static IntPtr SetHook(LowLevelKeyboardProc proc)
{
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
{
return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
GetModuleHandle(curModule.ModuleName), 0);
}
}
private delegate IntPtr LowLevelKeyboardProc(
int nCode, IntPtr wParam, IntPtr lParam);
private static IntPtr HookCallback(
int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
Console.WriteLine((Keys)vkCode);
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook,
LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
}
if ((Control.ModifierKeys & Keys.Shift) != 0)
Đây cũng sẽ là true
nếu một phím modifier cũng là xuống (ví dụ: Ctrl + Shift). Nếu bạn muốn kiểm tra xem phím Shift một mình được nhấn mà không cần bất kỳ bổ khác, sử dụng
if (Control.ModifierKeys == Keys.Shift)
Lưu ý rằng ngay cả điều này sẽ true
nếu một phi modifier là xuống (Ví dụ, Shift + A). Nếu bạn muốn kiểm tra xem Shift và chỉ có Shift được nhấn, bạn sẽ phải sử dụng cuộc gọi API.
Nếu bạn đang ở trong một lớp kế thừa Control
(chẳng hạn như một hình thức), bạn có thể loại bỏ các Control
vòng loại. (static
thuộc tính không cần bộ định tính trong các lớp kế thừa)
- 1. javascript - phát hiện phím ctrl được nhấn hoặc lên, sự kiện nhấn phím không kích hoạt
- 2. Kích hoạt sự kiện nhấn phím bàn phím mà không cần nhấn phím từ bàn phím
- 3. Ghi lại sự kiện nhấn phím "shift + tab"
- 4. Tại sao không phát hiện lại không gian sử dụng sự kiện nhấn phím jquery?
- 5. Xác định nếu phím Shift được nhấn trong sự kiện được tổ chức một lần
- 6. Java - Chúng tôi có thể phát hiện nếu một phím được nhấn mà không sử dụng Trình nghe không?
- 7. Dừng sự kiện nhấn phím
- 8. Sự kiện nhấn phím tab trong JavaScript?
- 9. Accelerator (key mnemonic) được thực hiện mà không cần nhấn phím ALT
- 10. Phát hiện Phím Enter được nhấn với jquery
- 11. Phát hiện nhấn phím trong Google Maps
- 12. Không có sự kiện nhấn phím nào cho các phím nhất định trong trình duyệt Android
- 13. Windows Forms Textbox Nhập phím
- 14. C# - Phát hiện nếu phím SHIFT được giữ khi mở menu ngữ cảnh
- 15. phím shift chỉ bị bỏ qua sau khi một phím khác đã bị khóa, phím shift kém. Làm thế nào để phát hiện khi nó được phát hành?
- 16. Phát hiện sự kiện bàn phím trong C
- 17. Làm cách nào để phát hiện phím shift + trong javascript?
- 18. Mô phỏng sự kiện Nhấn phím bằng Python cho Linux
- 19. không thể kích hoạt sự kiện nhấn phím khi nhấn phím xóa
- 20. jQuery: cách lọc ra các phím không phải ký tự trên sự kiện nhấn phím?
- 21. Mô phỏng sự kiện nhấn phím TAB trong Selenium RC
- 22. Xử lý các sự kiện phím Ctrl + Tab và Ctrl + Shift + Tab
- 23. Phím Alt và tab không hoạt động trong Windows Forms được mở từ ứng dụng WPF
- 24. Ollydbg "Sự kiện một bước tại ntdll - Nhấn shift + f8 để vượt qua thực thi ...."?
- 25. Phím shift được giữ trong JavaScript
- 26. .NET Windows Forms - chặn sự kiện Close X
- 27. Phát hiện các tổ hợp phím
- 28. phím Shift trong C++
- 29. Cách phát hiện mã C# Windows Forms được thực hiện trong Visual Studio?
- 30. jHtmlArea xử lý sự kiện của phím nhấn
Tác phẩm này hoạt động nhưng thuộc tính được kế thừa từ Kiểm soát không phải biểu mẫu –