2013-07-23 2 views
1

글로벌 후크 SetWindowsHookEx 표준 폼의 버튼이 이상하게 작동하도록 설정 한 후. 예를 들어, 닫기 버튼을 클릭하면 마우스가 5-10 초 동안 멈추고 모양이 바뀝니다.SetWindowsHookEx 및 폼 최소화시 최소화/최대화/닫기 버튼 클릭

동일한 문제가있는 주제가 있습니다. C# low level mouse hook and form event handling 하지만 답변은 하나뿐입니다. 그리고 그 솔루션을 좋아하지 않습니다. 매번 훅을 할 때, 폼이 비활성화 될 때 UnHook을해야하기 때문에 ...

이 문제를 해결하는 더 좋은 방법이 있습니까? 당신은 네이티브 모듈에 대한 핸들을 필요

using System.Windows.Forms; 
using Gma.UserActivityMonitor; 
using System; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 

namespace WinFormsHook 
{ 
    public partial class Form1 : Form 
    { 
     int s_MouseHookHandle; 

     public Form1() 
     { 
      InitializeComponent(); 
      IntPtr hInst = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName); 
      s_MouseHookHandle = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, hInst, 0); 
     } 

     private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
     { 
      UnhookWindowsHookEx(s_MouseHookHandle); 
     } 

     private int MouseHookProc(int nCode, int wParam, IntPtr lParam) 
     { 
      if (nCode >= 0) 
      { 
       Debug.WriteLine(wParam); 
       if (wParam == WM_LBUTTONDOWN) 
       { 
        Action action =() => this.Text += "."; 
        this.Invoke(action); 
       } 
      } 

      //call next hook 
      return CallNextHookEx(s_MouseHookHandle, nCode, wParam, lParam); 
     } 

     private const int WH_MOUSE_LL = 14; 
     private const int WM_LBUTTONDOWN = 0x201; 

     private delegate int HookProc(int nCode, int wParam, IntPtr lParam); 

     [DllImport("kernel32.dll")] 
     public static extern IntPtr GetModuleHandle(string name); 

     [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)] 
     private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, int dwThreadId); 

     [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)] 
     private static extern int UnhookWindowsHookEx(int idHook); 

     [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
     private static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam); 
    } 
} 
+0

세계적인 고리일까요? –

+0

@KingKing, 예. MouseDoubleClick 이벤트에 대한 후크입니다. –

+0

사용자가 두 번 클릭하면 어떻게 할 것입니까? 후크를 사용해야합니까? 제가 묻는 것은 왜 다른 방법이있을 수 있듯이 이것을하고있는 것입니다. – TheKingDave

답변

1

:

편집

여기 내 코드입니다. 이것이 글로벌 훅으로 작동 할 것이라고 기대하지 마십시오. 훅 구현시 .NET JIT가 실행되어야합니다!

실제로 모든 관리되지 않는 프로세스는 처리기를 실행하지 못합니다! 이것이 시스템 블록의 이유라고 생각합니다.

...

당신이 글로벌 후크를 원하지 않는 것 같다 코드를 다시 읽은 후 ('이'다른 프로세스에는 meanng이 없습니다). 그래서 SetWindowsHookEx의 RTFM과 마지막 인수를 적절히 설정하십시오.

참고로 an old question of mine을 제안합니다.