Winform 과 WPF 에 전역 단축 키 를 등록 하여 아이디어 와 코드 를 실현 합 니 다.

단축 키 보조 클래스
 
class HotKey
{
/// <summary>
/// , 0。
/// , 0。 , GetLastError。.NET :Marshal.GetLastWin32Error()
/// </summary>
/// <param name="hWnd"> </param>
/// <param name="id"> ID( ID ) </param>
/// <param name="fsModifiers"> Alt、Ctrl、Shift、Windows </param>
/// <param name="vk"> ,WinForm Keys ,
/// WPF Key , System.Windows.Forms.Keys , int </param>
/// <returns></returns>
[DllImport("user32.dll", SetLastError = true)]
public static extern bool RegisterHotKey(
IntPtr hWnd,
int id,
KeyModifiers fsModifiers,
int vk
);
/// <summary>
///
/// </summary>
/// <param name="hWnd"> </param>
/// <param name="id"> ID</param>
/// <returns></returns>
[DllImport("user32.dll", SetLastError = true)]
public static extern bool UnregisterHotKey(
IntPtr hWnd,
int id
);
/// <summary>
/// , , ID, 0
/// </summary>
/// <param name="lpString"></param>
/// <returns></returns>
[DllImport("kernel32", SetLastError = true)]
public static extern short GlobalAddAtom(string lpString);
[DllImport("kernel32", SetLastError = true)]
public static extern short GlobalDeleteAtom(short nAtom);
/// <summary>
/// ( , )
/// </summary>
[Flags()]
public enum KeyModifiers
{
None = 0,
Alt = 1,
Ctrl = 2,
Shift = 4,
WindowsKey = 8
}
/// <summary>
/// ID
/// </summary>
public const int WM_HOTKEY = 0x312;
}
WinForm 방법:onload 에 이 벤트 를 등록 한 다음 에 WndProc 를 다시 불 러 오고 돌아 오 는 메 시 지 를 처리 할 수 있 습 니 다
 
int alts,altd;
protected override void OnLoad(EventArgs e)
{
alts= HotKey.GlobalAddAtom("Alt-S");
altd= HotKey.GlobalAddAtom("Alt-D");
HotKey.RegisterHotKey(this.Handle, alts, HotKey.KeyModifiers.Alt, (int)Keys.S);
HotKey.RegisterHotKey(this.Handle, altd, HotKey.KeyModifiers.Alt, (int)Keys.D);
}
protected override void WndProc(ref Message m)// Windows
{
switch (m.Msg)
{
case HotKey.WM_HOTKEY:
ProcessHotkey(m);// ProcessHotkey()
break;
}
base.WndProc(ref m); // WndProc
}
private void ProcessHotkey(Message m) //
{
IntPtr id = m.WParam;//IntPtr
int sid=id.ToInt32();
if(sid==alts)
{
MessageBox.Show(" Alt+S");
}
else if(sid==altd)
{
MessageBox.Show(" Alt+D");
}
}
.Application 에서 AddMessageFilter 추가 처 리 를 사용 하여 WndProc 를 다시 불 러 오 면 form 자체 가 IMessageFilter 인 터 페 이 스 를 실현 할 수 있 습 니 다.등록 방법
 
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var form = new Form1();
Application.AddMessageFilter(form);
Application.Run(form);
}
인터페이스 구현
 
bool IMessageFilter.PreFilterMessage(ref Message m)
{
const int WM_HOTKEY = 0x0312;// m.Msg 0x0312
switch (m.Msg)
{
case WM_HOTKEY:
ProcessHotkey(m);// ProcessHotkey()
break;
}
// , true; , false
return false ;
}
AddMessage Filter 와 WNProc 에서 메 시 지 를 동시에 처리 할 경우,순 서 는 IMessageFilter 를 먼저 사용 한 다음 에 WNProc WPF 방법 을 호출 합 니 다.WPF 의 등록 방법 은 Winform 과 같 습 니 다.다만 WPF 의 Key 가 매 거 한 값 은 정확하게 감청 할 수 없습니다.System.Windows.Forms.Keys 또는 자신의 정 의 를 참조 해 야 정확하게 등록 할 수 있 습 니 다.창 핸들 도 WindowInteropHelper 를 통 해 얻 을 수 있 으 며,처리 함수 의 추가 도 Winform 과 달리 Hwndsourd 가 처리 함 수 를 추가 해 야 합 니 다.등록 및 처리 방법
 
int alts, altd;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
HwndSource hWndSource;
WindowInteropHelper wih = new WindowInteropHelper(this);
hWndSource = HwndSource.FromHwnd(wih.Handle);
//
hWndSource.AddHook(MainWindowProc);
alts = HotKey.GlobalAddAtom("Alt-S");
altd = HotKey.GlobalAddAtom("Alt-D");
HotKey.RegisterHotKey(wih.Handle, alts, HotKey.KeyModifiers.Alt, (int)System.Windows.Forms.Keys.S);
HotKey.RegisterHotKey(wih.Handle, altd, HotKey.KeyModifiers.Alt, (int)System.Windows.Forms.Keys.D);
}
private IntPtr MainWindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
switch (msg)
{
case HotKey.WM_HOTKEY:
{
int sid = wParam.ToInt32();
if (sid == alts)
{
MessageBox.Show(" Alt+S");
}
else if (sid == altd)
{
MessageBox.Show(" Alt+D");
}
handled = true;
break;
}
}
return IntPtr.Zero;
}
주의:단축 키 를 등록 하면 RegisterHotKey 의 fsModifiers 매개 변 수 는 0,즉 None 옵션 입 니 다.일부 보안 소프트웨어 는 경 보 를 울 립 니 다.이 로 인해 전체 키보드 감청 으로 인해 안전 문제 가 발생 할 수 있 습 니 다코드 다운로드

좋은 웹페이지 즐겨찾기