标题:想坐标移位点击计算器内的数字随便一个都好,为什么计算器一点反应都没有, ...
只看楼主
caicaicai0
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2020-6-3
结帖率:0
已结贴  问题点数:20 回复次数:11 
想坐标移位点击计算器内的数字随便一个都好,为什么计算器一点反应都没有,有大佬知道不?
#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;
}
搜索更多相关主题的帖子: 坐标 include 计算器 数字 HWND 
2020-06-03 12:15
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:20 
窗口句柄有无选对,最好拦截相关消息看看手动和自动点击是否一样
看了一下Win10算计器的窗口结构:
2020-06-03 18:38
caicaicai0
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2020-6-3
得分:0 
回复 2楼 吹水佬
我系统Win7,电脑上只有一个系统自带的计算器
2020-06-03 19:25
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用caicaicai0在2020-6-3 19:25:04的发言:

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

如果计算器不只一个窗口对象,就好象Win10的计算器就有4个窗口对象,鼠标点击消息的处理就有点复杂。
有子窗口的都试试看
2020-06-03 21:08
caicaicai0
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2020-6-3
得分:0 
回复 4楼 吹水佬
只有一个计算器窗口,而且我电脑只有一个计算器软件,我用FindWindowEx查找子类名CalcFrame也不管用,不知道怎么回事
2020-06-03 22:26
caicaicai0
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2020-6-3
得分:0 
回复 5楼 caicaicai0
能查得到句柄就是不能模拟点击
2020-06-03 22:31
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 6楼 caicaicai0
消息能正常发到窗口,也不一定能模拟手动点击效果,这要看消息触发事件过程是怎样处理。
用mouse_event()或SendInput()模拟手动就可以
2020-06-03 22:47
caicaicai0
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2020-6-3
得分:0 
回复 7楼 吹水佬
hmouse_event()或SendInput()好像不能加入hwnd句柄
2020-06-04 09:06
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用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));
2020-06-04 09:28
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 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;
}
2020-06-04 09:48



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-501943-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019726 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved