2013-03-14 41 views
15

Tôi có một ứng dụng chạy ẩn. Tôi phải tạo một số sự kiện bất cứ khi nào người dùng nhấn F12 bất kỳ lúc nào. Vì vậy, những gì tôi cần để nắm bắt một phím bấm. Trong đơn đăng ký của tôi, nếu bất kỳ lúc nào người dùng nhấn F10 một số sự kiện sẽ được thực hiện. Tôi không hiểu làm thế nào để làm điều đó?Chụp một phím nhấn trên nền

Có ai biết cách làm điều đó không?

N: B: Đây là ứng dụng winforms. Nó không cần phải tập trung vào mẫu của tôi. Cửa sổ chính của tôi có thể vẫn còn trong khay hệ thống nhưng vẫn phải giữ phím bấm.

+0

có thể trùng lặp với [nhấn phím chức năng xử lý] (http://stackoverflow.com/questions/1707040/handling-function-key-press) –

+0

Loại ứng dụng nào? "Chạy trong nền" có nghĩa là gì? "Bất cứ lúc nào" (ứng dụng của bạn có tập trung) không? –

+0

Bạn đang sử dụng biểu mẫu để thực hiện thao tác nhấn phím? Đây có phải là một ứng dụng Console không? –

Trả lời

34

Điều bạn muốn là một phím nóng toàn cầu toàn cầu.

  1. nhập cần các thư viện ở phía trên cùng của lớp học của bạn:

    // DLL libraries used to manage hotkeys 
    [DllImport("user32.dll")] 
    public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc); 
    [DllImport("user32.dll")] 
    public static extern bool UnregisterHotKey(IntPtr hWnd, int id); 
    
  2. Thêm một trường trong lớp học của bạn đó sẽ là một tài liệu tham khảo cho các hotkey trong mã của bạn:

    const int MYACTION_HOTKEY_ID = 1; 
    
  3. Đăng ký phím nóng (trong hàm tạo của Biểu mẫu Windows của bạn chẳng hạn):

    // Modifier keys codes: Alt = 1, Ctrl = 2, Shift = 4, Win = 8 
    // Compute the addition of each combination of the keys you want to be pressed 
    // ALT+CTRL = 1 + 2 = 3 , CTRL+SHIFT = 2 + 4 = 6... 
    RegisterHotKey(this.Handle, MYACTION_HOTKEY_ID, 6, (int) Keys.F12); 
    
  4. Xử lý các phím gõ bằng cách thêm các phương pháp sau đây trong lớp học của bạn:

    protected override void WndProc(ref Message m) { 
        if (m.Msg == 0x0312 && m.WParam.ToInt32() == MYACTION_HOTKEY_ID) { 
         // My hotkey has been typed 
    
         // Do what you want here 
         // ... 
        } 
        base.WndProc(ref m); 
    } 
    
+0

Là một sang một bên, tôi không phải là một fan hâm mộ lớn của các phím nóng toàn cầu - tôi nghĩ rằng họ có khả năng "nguy hiểm". Nếu hai ứng dụng đăng ký cùng một khóa thì sao? Nó có thể có hậu quả bất ngờ trừ khi được xử lý rất cẩn thận. Và ngay cả khi bạn xử lý cẩn thận, không có gì nói rằng ứng dụng khác cũng vậy. Loại giống như là một người lái xe tuyệt vời, nhưng phải lo lắng về các trình điều khiển khác trên đường. –

+0

nó sẽ hoạt động nếu biểu mẫu của tôi không tập trung ??? – DarkenShooter

+0

@DarkenShooter: Có. – Otiel

6

Trong trường hợp bạn có vấn đề chạy Otiel của giải pháp:

  1. Bạn cần phải bao gồm:

    using System.Runtime.InteropServices; //required for dll import 
    
  2. Một nghi ngờ cho người mới như tôi: "top của lớp" thực sự có nghĩa là trên cùng của lớp học của bạn như thế này (không phải không gian tên hoặc constructor):

    public partial class Form1 : Form 
    { 
    
        [DllImport("user32.dll")] 
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc); 
        [DllImport("user32.dll")] 
        public static extern bool UnregisterHotKey(IntPtr hWnd, int id); 
    
  3. Bạn không cần phải thêm user32.dll như tài liệu tham khảo để dự án. WinForms luôn tự động tải dll này.

Các vấn đề liên quan