2016-06-17 1 views
1
using System; 

using System.ComponentModel; 

using System.Diagnostics; 

using System.Runtime.InteropServices; 

using System.Windows.Forms; 

namespace ScreenYos 
{ 
public class KeyboardHook : IDisposable 
{ 
    private bool Global = false; 

    public delegate void LocalKeyEventHandler(Keys key, bool Printscreen); 

    public event LocalKeyEventHandler KeyDown; 
    public event LocalKeyEventHandler KeyUp; 

    public delegate int CallbackDelegate(int Code, int W, int L); 

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
    public struct KBDLLHookStruct 
    { 
     public Int32 vkCode; 
     public Int32 scanCode; 
     public Int32 flags; 
     public Int32 time; 
     public Int32 dwExtraInfo; 
    } 

    [DllImport("user32", CallingConvention = CallingConvention.StdCall)] 
    private static extern int SetWindowsHookEx(HookType idHook, CallbackDelegate lpfn, int hInstance, int threadId); 

    [DllImport("user32", CallingConvention = CallingConvention.StdCall)] 
    private static extern bool UnhookWindowsHookEx(int idHook); 

    [DllImport("user32", CallingConvention = CallingConvention.StdCall)] 
    private static extern int CallNextHookEx(int idHook, int nCode, int wParam, int lParam); 

    [DllImport("kernel32.dll", CallingConvention = CallingConvention.StdCall)] 
    private static extern int GetCurrentThreadId(); 

    public enum HookType : int 
    { 
     WH_JOURNALRECORD = 0, 
     WH_JOURNALPLAYBACK = 1, 
     WH_KEYBOARD = 2, 
     WH_GETMESSAGE = 3, 
     WH_CALLWNDPROC = 4, 
     WH_CBT = 5, 
     WH_SYSMSGFILTER = 6, 
     WH_MOUSE = 7, 
     WH_HARDWARE = 8, 
     WH_DEBUG = 9, 
     WH_SHELL = 10, 
     WH_FOREGROUNDIDLE = 11, 
     WH_CALLWNDPROCRET = 12, 
     WH_KEYBOARD_LL = 13, 
     WH_MOUSE_LL = 14 
    } 

    private int HookID = 0; 
    private CallbackDelegate TheHookCB = null; 

    public KeyboardHook(bool Global) 
    { 
     this.Global = Global; 
     TheHookCB = new CallbackDelegate(KeybHookProc); 
     if (Global) 
     { 
      HookID = SetWindowsHookEx(HookType.WH_KEYBOARD_LL, TheHookCB, 
       0, 
       0); 
     } 
     else 
     { 
      HookID = SetWindowsHookEx(HookType.WH_KEYBOARD, TheHookCB, 
       0, 
       GetCurrentThreadId()); 
     } 
    } 

    private bool IsFinalized; 

    ~KeyboardHook() 
    { 
     if (!IsFinalized) 
     { 
      UnhookWindowsHookEx(HookID); 
      IsFinalized = true; 
     } 
    } 

    public void Dispose() 
    { 
     if (!IsFinalized) 
     { 
      UnhookWindowsHookEx(HookID); 
      IsFinalized = true; 
     } 
    } 


    private int KeybHookProc(int Code, int W, int L) 
    { 
     KBDLLHookStruct LS = new KBDLLHookStruct(); 
     if (Code < 0) 
     { 
      return CallNextHookEx(HookID, Code, W, L); 
     } 
     try 
     { 
      if (!Global) 
      { 
       if (Code == 3) 
       { 
        IntPtr ptr = IntPtr.Zero; 

        int keydownup = L >> 30; 
        if (keydownup == 0) 
        { 
         if (KeyDown != null) 
          KeyDown((Keys) W, GetPrintscreenPressed()); 
        } 
        if (keydownup == -1) 
        { 
         if (KeyUp != null) KeyUp((Keys) W, GetPrintscreenPressed()); 
        } 
        //System.Diagnostics.Debug.WriteLine("KeyDown: " + (Keys)W); 
       } 
      } 
      else 
      { 
       KeyEvents kEvent = (KeyEvents) W; 

       Int32 vkCode = Marshal.ReadInt32((IntPtr) L); 

       if (kEvent != KeyEvents.KeyDown && kEvent != KeyEvents.KeyUp && kEvent != KeyEvents.SKeyDown && 
        kEvent != KeyEvents.SKeyUp) 
       { 
       } 
       if (kEvent == KeyEvents.KeyDown || kEvent == KeyEvents.SKeyDown) 
       { 
        if (KeyDown != null) 
         KeyDown((Keys) vkCode, GetPrintscreenPressed()); 
       } 
       if (kEvent == KeyEvents.KeyUp || kEvent == KeyEvents.SKeyUp) 
       { 
        if (KeyUp != null) KeyUp((Keys) vkCode, GetPrintscreenPressed()); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      //Console.WriteLine(e.Message); 
     } 

     return CallNextHookEx(HookID, Code, W, L); 

    } 

    public enum KeyEvents 
    { 
     KeyDown = 0x0100, 
     KeyUp = 0x0101, 
     SKeyDown = 0x0104, 
     SKeyUp = 0x0105 
    } 

    [DllImport("user32.dll")] 
    public static extern short GetKeyState(Keys nVirtKey); 

    public static bool GetPrintscreenPressed() 
    { 
     int state = GetKeyState(Keys.PrintScreen); 
     if (state > 1 || state < -1) return true; 
     return false; 
    } 
} 

}내 키보드 후크 모든 키를 캡처

내 사용 :

private static void Kh_KeyDown(Keys key, bool Printscreen) 
    { 
     if (new Form1().ShowDialog() == DialogResult.OK) 
     { 
     Application.Run(new Form1()); 
     } 
    } 

그래서 프로그램이 시스템 트레이에서 실행 코드의 목적은 전 세계적으로 캡처 키이며 PRINTSCREEN을 누르면 실행을 Form1 아직 모든 키를 캡처하고 어떤 키를 눌러도 form1을 실행합니다.

+0

당신은 질문을 지정할 수 있습니까? 너는 무엇을 알고 싶니? http://stackoverflow.com/help/how-to-ask –

+0

'KeyboardHook'이 구축 된 곳에 코드를 제공하십시오. '글로벌'매개 변수는 사실입니까? –

답변

0

KeyDown의 모든 키에 대한 일반 콜백을 초기화했기 때문입니다.

은 당신도 Keys.PrintScreen에 의해 필터를 사용하면 이벤트를

또는 이벤트 핸들러에서 Keys.PrintScreen에 의해

필터를 호출해야 할 때.

private static void Kh_KeyDown(Keys key, bool Printscreen) 
{ 
    if (key == Keys.PrintScreen && new Form1().ShowDialog() == DialogResult.OK) 
    { 
     Application.Run(new Form1()); 
    } 
} 

토마스

+0

오 하나님. 고마워,이게 내 문제를 해결 :) – Emir