글로벌 후크 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);
}
}
세계적인 고리일까요? –
@KingKing, 예. MouseDoubleClick 이벤트에 대한 후크입니다. –
사용자가 두 번 클릭하면 어떻게 할 것입니까? 후크를 사용해야합니까? 제가 묻는 것은 왜 다른 방법이있을 수 있듯이 이것을하고있는 것입니다. – TheKingDave