cuốn sách gpt4 ai đã làm

c# - 鼠标 Hook 断开

In lại Tác giả: Vũ trụ không gian 更新时间:2023-11-03 15:13:08 30 4
mua khóa gpt4 Nike

我正在尝试实现一个颜色选择器,它从屏幕上各处的像素中获取颜色。为此,我计划使用全局鼠标 Hook 来监听 WM_MOUSEMOVE,以便在鼠标四处移动时更新颜色,并监听鼠标点击以确认 (WM_LBUTTONDOWN) 或取消 (WM_RBUTTONDOWN) 操作。

我遵循了众多教程中的一个,并想出了这个(在控制台应用程序中,只是为了测试该过程是否有效):

static IntPtr hook;
static bool click;
static NativeMethods.LowLevelHookStruct llhs;

static void Main(string[] args)
{
hook = NativeMethods.SetWindowsHookEx(NativeMethods.WH_MOUSE_LL, MouseHookCallback, (IntPtr)null, 0);
if (hook != IntPtr.Zero)
{
Console.WriteLine("Hook Set");
while (!Console.KeyAvailable) {
Console.WriteLine("{0} {1} {2}", hook, llhs.pt.x, llhs.pt.y);

if(click) Console.WriteLine("click!");
click = false;

System.Threading.Thread.Sleep(250);
}
}
}

public static IntPtr MouseHookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0)
{
NativeMethods.LowLevelHookStruct hookStruct = (NativeMethods.LowLevelHookStruct)Marshal.PtrToStructure(lParam, typeof(NativeMethods.LowLevelHookStruct));

if (NativeMethods.MouseMessages.WM_MOUSEMOVE == (NativeMethods.MouseMessages)wParam)
{
llhs = hookStruct;
}

if (NativeMethods.MouseMessages.WM_LBUTTONDOWN == (NativeMethods.MouseMessages)wParam)
{
click = true;
}
else if (NativeMethods.MouseMessages.WM_RBUTTONDOWN == (NativeMethods.MouseMessages)wParam)
{
}
}

return NativeMethods.CallNextHookEx(hook, nCode, wParam, lParam);
}

NativeMethods 只是一个类,我在其中保留所有与 DllImport 相关的内容。

一旦我运行控制台应用程序,鼠标光标就会卡住几秒钟,在控制台中我会得到这个 - 即使光标卡住

Hook Set
3945554872 0 0
3945554872 0 0
3945554872 0 0
3945554872 0 0
...

在调试中,我的钩子(Hook)似乎从未被调用过,一次也没有。知道可能出了什么问题吗?

câu trả lời hay nhất

在@Hans Passant 发表评论后,我将测试代码移到了 WinForms 应用程序中,回调开始出现。

然后发现回调正在被垃圾收集只是一回事,所以我所要做的就是改变

hook = NativeMethods.SetWindowsHookEx(NativeMethods.WH_MOUSE_LL, MouseHookCallback, (IntPtr)null, 0);

đến

private NativeMethods.LowLevelHookProc _hookCallback;

...

_hookCallback = new NativeMethods.LowLevelHookProc(MouseHookCallback);
hook = NativeMethods.SetWindowsHookEx(NativeMethods.WH_MOUSE_LL, _hookCallback, (IntPtr)null, 0);

为了保留对回调的引用,这样它就不会被 GC。

关于c# - 鼠标 Hook 断开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40258683/

30 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress