注册 登录
编程论坛 C语言论坛

想坐标移位点击计算器内的数字随便一个都好,为什么计算器一点反应都没有,有大佬知道不?

caicaicai0 发布于 2020-06-03 12:15, 3226 次点击
#include<stdlib.h>
#include<windows.h>
#include<stdio.h>
int main(int argc, char* argv[])
{
HWND hwnd= FindWindow(NULL, "计算器");
WPARAM wParam = MK_LBUTTON;
LPARAM lParam = MAKELONG(150, 150);
SendMessage(hwnd, WM_LBUTTONDOWN, wParam, lParam);
Sleep(500);
SendMessage(hwnd, WM_LBUTTONUP, wParam, lParam);
return 0;
}
11 回复
#2
吹水佬2020-06-03 18:38
窗口句柄有无选对,最好拦截相关消息看看手动和自动点击是否一样
看了一下Win10算计器的窗口结构:
只有本站会员才能查看附件,请 登录
#3
caicaicai02020-06-03 19:25
回复 2楼 吹水佬
我系统Win7,电脑上只有一个系统自带的计算器
#4
吹水佬2020-06-03 21:08
以下是引用caicaicai0在2020-6-3 19:25:04的发言:

我系统Win7,电脑上只有一个系统自带的计算器

如果计算器不只一个窗口对象,就好象Win10的计算器就有4个窗口对象,鼠标点击消息的处理就有点复杂。
有子窗口的都试试看
#5
caicaicai02020-06-03 22:26
回复 4楼 吹水佬
只有一个计算器窗口,而且我电脑只有一个计算器软件,我用FindWindowEx查找子类名CalcFrame也不管用,不知道怎么回事
#6
caicaicai02020-06-03 22:31
回复 5楼 caicaicai0
能查得到句柄就是不能模拟点击
#7
吹水佬2020-06-03 22:47
回复 6楼 caicaicai0
消息能正常发到窗口,也不一定能模拟手动点击效果,这要看消息触发事件过程是怎样处理。
用mouse_event()或SendInput()模拟手动就可以
#8
caicaicai02020-06-04 09:06
回复 7楼 吹水佬
hmouse_event()或SendInput()好像不能加入hwnd句柄
#9
吹水佬2020-06-04 09:28
以下是引用caicaicai0在2020-6-4 09:06:19的发言:

hmouse_event()或SendInput()好像不能加入hwnd句柄

hmouse_event()或SendInput()是针对整个屏幕的。
试了一下XP的计算器,消息发到主窗口对象不行,要发到按钮对象才可以。
XP计算器的窗口对象结构:
只有本站会员才能查看附件,请 登录

如:要点击按钮7,句柄是132662
代码:
    HWND hWnd = (HWND)132662;
    SendMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELONG(2,2));
    SendMessage(hWnd, WM_LBUTTONUP, MK_LBUTTON, MAKELONG(2,2));
#10
吹水佬2020-06-04 09:48
回复 8楼 caicaicai0
SendInput()的示例:

#include<windows.h>
#include<stdio.h>

void MouseClick(HWND hWnd, int xPos, int yPos)
{
    SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0,(SWP_NOMOVE|SWP_NOSIZE));
    RECT rect;
    GetWindowRect(hWnd, &rect);
    INPUT input;
    input.type = INPUT_MOUSE;
    input.mi.dx = 0xFFFF/(GetSystemMetrics(SM_CXSCREEN)-1) * (rect.left+xPos);
    input.mi.dy = 0xFFFF/(GetSystemMetrics(SM_CYSCREEN)-1) * (rect.top+yPos);
    // 先看看确定鼠标移动位置
    //input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
    input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP;
    SendInput(1, &input, sizeof(INPUT));
    SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0,(SWP_NOMOVE|SWP_NOSIZE));
}

int main(int argc, char* argv[])
{
    HWND hWnd = FindWindow(NULL, "计算器");
    if (hWnd == NULL)
        return 0;
    int X = 220;    // 相对窗口区域
    int Y = 380;
    MouseClick(hWnd, X, Y);
    return 0;
}
#11
caicaicai02020-06-04 11:46
回复 10楼 吹水佬
这种方法好像只能保持计算器窗口置顶,隐藏窗口就会乱点坐标
#12
吹水佬2020-06-04 12:04
以下是引用caicaicai0在2020-6-4 11:46:24的发言:

这种方法好像只能保持计算器窗口置顶,隐藏窗口就会乱点坐标

模拟手动的就是这样结果,点击的地方必须是当前活动的窗口,隐藏的窗口就不可见无处可点。
能直接发消息最好,如果要操作的窗口程序是第三方的,要搞清楚窗口消息处理过程有时不是件简单的事。
1