WPFのシールドシステムのホットキーの例コード
15033 ワード
wpfのサンプルコードは私が前にいくつかのコードを得るべきだが、私は私のwpfプログラムに置いてキーボードのフックのハンドルの値はずっと0なのか分からないが、なぜフックはずっとインストールに成功しなかったのか分からないが、winformの中でホットキーをテストしてもALT+F 4を除いてシールドされているので、私にあげたいのはwpfの成功サンプルコードだ.
usingSystem;
usingSystem.Windows;
usingSystem.Runtime.InteropServices;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial classApp:Application
{
privatestruct KBDLLHOOKSTRUCT
{
publicint vkCode;
int scanCode;
publicint flags;
int time;
int dwExtraInfo;
}
privatedelegateintLowLevelKeyboardProcDelegate(int nCode,int wParam,ref KBDLLHOOKSTRUCT lParam);
[DllImport("user32.dll")]
privatestaticexternIntPtrSetWindowsHookEx(int idHook,LowLevelKeyboardProcDelegate lpfn,IntPtr hMod,int dwThreadId);
[DllImport("user32.dll")]
privatestaticexternboolUnhookWindowsHookEx(IntPtr hHook);
[DllImport("user32.dll")]
privatestaticexternintCallNextHookEx(int hHook,int nCode,int wParam,ref KBDLLHOOKSTRUCT lParam);
[DllImport("kernel32.dll")]
privatestaticexternIntPtrGetModuleHandle(IntPtr path);
privateIntPtr hHook;
LowLevelKeyboardProcDelegate hookProc;// prevent gc
constint WH_KEYBOARD_LL =13;
publicApp()
{
// hook keyboard
IntPtr hModule =GetModuleHandle(IntPtr.Zero);
hookProc =newLowLevelKeyboardProcDelegate(LowLevelKeyboardProc);
hHook =SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, hModule,0);
if(hHook ==IntPtr.Zero)
{
MessageBox.Show("Failed to set hook, error = "+Marshal.GetLastWin32Error());
}
}
protectedoverridevoidOnExit(ExitEventArgs e)
{
UnhookWindowsHookEx(hHook);// release keyboard hook
base.OnExit(e);
}
privatestaticintLowLevelKeyboardProc(int nCode,int wParam,ref KBDLLHOOKSTRUCT lParam)
{
if(nCode >=0)
switch(wParam)
{
case256:// WM_KEYDOWN
case257:// WM_KEYUP
case260:// WM_SYSKEYDOWN
case261:// M_SYSKEYUP
if(
(lParam.vkCode ==0x09&& lParam.flags ==32)||// Alt+Tab
(lParam.vkCode ==0x1b&& lParam.flags ==32)||// Alt+Esc
(lParam.vkCode ==0x73&& lParam.flags ==32)||// Alt+F4
(lParam.vkCode ==0x1b&& lParam.flags ==0) ||// Ctrl+Esc
(lParam.vkCode ==0x5b&& lParam.flags ==1) ||// Left Windows Key
(lParam.vkCode ==0x5c&& lParam.flags ==1)) // Right Windows Key
{
return1;
}
break;
}
returnCallNextHookEx(0, nCode, wParam,ref lParam);
}
}
}
:http://www.itstrike.cn/Question/b30528db-1a7e-46b2-a582-d8264f09bfb2