来自mouse_event的消息
message from mouse_event
#include <windows.h>
#include <time.h>
#define _USE_MATH_DEFINES
#include <math.h>
LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
static wchar_t szAppName[]=L"circle";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize=sizeof(wndclass);
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szAppName;
wndclass.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
RegisterClassEx(&wndclass);
hwnd=CreateWindow(szAppName,L"circle",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_MAXIMIZE);
UpdateWindow(hwnd);
SetTimer(hwnd,0,1,0);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
const int CENTER=300;
const int RADIUS=100;
LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static HDC wndDC=GetDC(hwnd);
switch(iMsg)
{
case WM_CREATE:
{
MoveToEx(wndDC,CENTER+RADIUS,CENTER,0);
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE, (CENTER+RADIUS)*(65535.0/1366),(CENTER)*(65535.0/768),0,0);
return 0;
}
case WM_PAINT:
{
hdc=BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);
return 0;
}
case WM_MOUSEMOVE:
LineTo(wndDC,LOWORD(lParam),HIWORD(lParam));
return 0;
case WM_TIMER:
{
srand(clock());
static int count=0;
for (int i=0;i<1000;i++)
{
count++;
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE, (CENTER+RADIUS*cos(2*M_PI*count/10000))*(65535.0/1366),
(CENTER+100*sin(2*M_PI*count/10000))*(65535.0/768),0,0);
}
if (count==10000)
KillTimer(hwnd,0);
return 0;
}
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,iMsg,wParam,lParam);
}
我期望得到圆圈,但得到十进制(我在这个程序中给mouse_event
打了10000次电话。消息WM_MOUSEMOVE被处理了 10 次(与计时器相同(。即,除了 1000 次中的一次之外,mouse_event 次调用(1000 次(未在消息队列中发送。这是什么原因呢?
WM_MOUSEMOVE
消息是合并消息。如果发生mouse_event并且应用程序尚未处理前一个mouse_event,则前一个将被丢弃。在您的情况下,您生成了 1000 个没有干预消息泵的mouse_events,因此除了最后一个消息泵之外,其他所有消息都被丢弃了。
for (int i=0;i<1000;i++)
{
// etc...
}
正如我在上一个问题中所解释的,Windows 只能在线程抽取消息循环时调用钩子回调。 当您的代码在此 for(( 循环中执行时,它不会执行任何抽水。 因此,Windows 会将您生成的所有鼠标事件累积到单个鼠标移动消息中。 当 for(( 循环退出时,你会得到它。
可能是您在时间间隔太短后调用mouse_event。这取决于 Win 设置中的鼠标阈值。您可以使用 uiAction = SPI_GETMOUSE 探测操作 SystemParametersInfo(...(。
最终,您可能会同步WM_MOUSEMOVE和mouse_event - 在成功WM_MOUSEMOVE后发送mouse_event。
相关文章:
- boost::进程间消息队列引发错误
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何通过参数抛出错误消息
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- 从服务器传输到客户端的消息不会出现
- ROS2 动态消息模板
- C++秘密消息学校作业
- glad 导致 glfwSwapBuffers 返回错误消息
- C++入门 5 版:类消息和文件夹
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 如何将 Firebase 与基于 Linux 的客户端应用配合使用,以便与服务器进行双向消息通信
- 重新定义预定义的 errno 错误消息 (E2BIG)
- Libmosquitto publish 不会将所有消息传递到 Azure IoT Hub