C++ 老鼠与睡眠

C++ 老鼠与睡眠,c++,winapi,C++,Winapi,所以我想让我的鼠标套工作。我需要在WM_LBUTTONUP发生时注册 HHOOK MouseHook; LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam){ PKBDLLHOOKSTRUCT k = (PKBDLLHOOKSTRUCT)(lParam); if (wParam == WM_LBUTTONUP) { Msg(":)"); } ret

所以我想让我的鼠标套工作。我需要在WM_LBUTTONUP发生时注册

HHOOK MouseHook;
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam){

    PKBDLLHOOKSTRUCT k = (PKBDLLHOOKSTRUCT)(lParam);

    if (wParam == WM_LBUTTONUP)
    {
        Msg(":)");
    }
    return CallNextHookEx(0, nCode, wParam, lParam);
}

...

MouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, hInstance, 0);

...

MSG msg;
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
现在的问题是,如果我在程序中的任何地方调用Sleep(),它将冻结鼠标。
我怎样才能避开这件事?是否可以在单独的线程中运行钩子?

在注册钩子的线程的上下文中调用低级钩子。因此,从不同的线程注册钩子。您将需要该线程泵送其消息队列,以便钩子工作


更大的问题是在主线程中调用
Sleep
。这将阻止您的UI响应。你需要停止那样做

在注册低级钩子的线程的上下文中调用低级钩子。因此,从不同的线程注册钩子。您将需要该线程泵送其消息队列,以便钩子工作


更大的问题是在主线程中调用
Sleep
。这将阻止您的UI响应。你需要停止那样做

在注册低级钩子的线程的上下文中调用低级钩子。因此,从不同的线程注册钩子。您将需要该线程泵送其消息队列,以便钩子工作


更大的问题是在主线程中调用
Sleep
。这将阻止您的UI响应。你需要停止那样做

在注册低级钩子的线程的上下文中调用低级钩子。因此,从不同的线程注册钩子。您将需要该线程泵送其消息队列,以便钩子工作


更大的问题是在主线程中调用
Sleep
。这将阻止您的UI响应。你需要停止那样做

这是因为低级键盘和鼠标挂钩需要消息泵n顺序,以便在事件上调用挂钩过程。调用
Sleep
时,它会阻止线程处理消息队列。发生这种情况时,钩子过程无法调用,windows钩子机制将被阻止,直到下一次执行消息泵

当钩子回调在安装钩子的线程的上下文中执行时,您确实可以在单独的线程中管理钩子。您还应该确保没有从钩子回调中调用
Sleep
,或者执行任何超出必要的操作,否则系统可能会自动删除它。从

这个钩子是在安装它的线程的上下文中调用的。调用是通过向安装钩子的线程发送消息来完成的。因此,安装钩子的线程必须有一个消息循环

钩子过程处理消息的时间应少于以下注册表项中LowLevel钩子估计值中指定的数据项:HKEY_CURRENT_USER\Control Panel\Desktop

该值以毫秒为单位。如果钩子过程超时,系统将消息传递给下一个钩子。但是,在Windows7和更高版本上,钩子会被悄悄地移除,而不会被调用。应用程序无法知道挂钩是否已移除

例如:

#include <windows.h>
#include <iostream>

LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    std::cout << "hook called" << std::endl;
    return CallNextHookEx(0, nCode, wParam, lParam);
}

DWORD WINAPI ThreadProc(void*)
{
    SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, NULL, 0);

    MSG msg;
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

int main()
{
    CreateThread(NULL, 0, ThreadProc, NULL, 0, 0);
    Sleep(20000);
}
#包括
#包括
LRESULT回调MouseHookProc(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM)
{

std::cout这是因为低级键盘和鼠标钩子需要消息泵n顺序才能在事件上调用钩子过程。当调用
Sleep
时,它会阻止线程处理消息队列。当发生这种情况时,钩子过程无法调用,windows钩子机制将阻塞,直到主机启动xt执行消息泵的时间

当钩子回调在安装钩子的线程的上下文中执行时,您确实可以在单独的线程中管理钩子。您还应该确保您没有从钩子回调中调用
Sleep
,或者执行任何不必要的操作,否则系统可能会自动删除钩子。From

此钩子是在安装它的线程的上下文中调用的。调用是通过向安装钩子的线程发送消息进行的。因此,安装钩子的线程必须具有消息循环

钩子过程处理消息的时间应少于以下注册表项中LowLevel钩子估计值中指定的数据项:HKEY_CURRENT_USER\Control Panel\Desktop

该值以毫秒为单位。如果钩子过程超时,系统会将消息传递给下一个钩子。但是,在Windows 7及更高版本上,钩子会在未调用的情况下以静默方式删除。应用程序无法知道钩子是否已删除

例如:

#include <windows.h>
#include <iostream>

LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    std::cout << "hook called" << std::endl;
    return CallNextHookEx(0, nCode, wParam, lParam);
}

DWORD WINAPI ThreadProc(void*)
{
    SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, NULL, 0);

    MSG msg;
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

int main()
{
    CreateThread(NULL, 0, ThreadProc, NULL, 0, 0);
    Sleep(20000);
}
#包括
#包括
LRESULT回调MouseHookProc(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM)
{

std::cout这是因为低级键盘和鼠标钩子需要消息泵n顺序才能在事件上调用钩子过程。当调用
Sleep
时,它会阻止线程处理消息队列。当发生这种情况时,钩子过程无法调用,windows钩子机制将阻塞,直到主机启动xt执行消息泵的时间

当钩子回调在安装钩子的线程的上下文中执行时,您确实可以在单独的线程中管理钩子。您还应该确保您没有从钩子回调中调用
Sleep
,或者执行任何不必要的操作,否则系统可能会自动删除钩子。From

此钩子是在安装它的线程的上下文中调用的。调用是通过向安装钩子的线程发送消息进行的。因此,安装钩子的线程必须具有消息循环

钩子过程处理消息的时间应少于指定的数据输入