2016-06-17 3 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のすべてのキーに対して一般コールバックを初期化したためです。あなたのEventHandlerで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

関連する問題