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