2012-01-18 21 views
8

Tôi đang cố gắng đăng ký một phím nóng, tôi dịch this C++, tôi đã viết nó:cách sử dụng RegisterHotKey() trong C#?

using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     [DllImport("user32.dll")] 
     public static extern 
      bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, int vk); 
     [DllImport("user32")] 
     public static extern 
      bool GetMessage(ref Message lpMsg, IntPtr handle, uint mMsgFilterInMain, uint mMsgFilterMax); 

     public const int MOD_ALT = 0x0001; 
     public const int MOD_CONTROL = 0x0002; 
     public const int MOD_SHIFT = 0x004; 
     public const int MOD_NOREPEAT = 0x400; 
     public const int WM_HOTKEY = 0x312; 
     public const int DSIX = 0x36; 

     static void Main(string[] args) 
     { 
      if (!RegisterHotKey(IntPtr.Zero, 1, MOD_ALT | MOD_NOREPEAT, DSIX)) 
      { 
       Console.WriteLine("failed key register!"); 
      } 

      Message msg = new Message(); 

      while (!GetMessage(ref msg, IntPtr.Zero, 0, 0)) 
      { 
       if (msg.message == WM_HOTKEY) 
       { 
        Console.WriteLine("do work.."); 
       } 
      } 

      Console.ReadLine(); 
     } 
    } 

    public class Message 
    { 
     public int message { get; set; } 
    } 
} 

nhưng nó RegisterHotKey() bao giờ trả về false. Tôi không chắc chắn về các đối số được truyền trong phương thức, IntPtr.Zero là để tương đương với null và lớp thông báo là đối tượng được yêu cầu trong đối số thứ hai. ai đó có thể làm rõ xin vui lòng? Bất kỳ trợ giúp là rất đánh giá cao!

+0

xem [này] (http://bloggablea.wordpress.com/ 2007/05/01/global-hotkeys-with-net /) – Shai

+0

LƯU Ý: giá trị của bạn cho MOD_NOREPEAT là sai. https://msdn.microsoft.com/en-us/library/windows/desktop/ms646309(v=vs.85).aspx –

+0

Ví dụ của bạn hoạt động hoàn hảo nếu bạn sử dụng giá trị không đổi thích hợp cho MOD_NOREPEAT và GetMessage phù hợp() định nghĩa (trả về một int và sử dụng cấu trúc MSG từ không gian tên System.Windows.Interop) – tigrou

Trả lời

1

này có thể giúp:

Hotkey in console app

Về cơ bản, bạn phải tạo một "ẩn" dưới hình thức để làm cho nó hoạt