2020/5/10 要结帖了,第一个问题今天也解决了。一开始我准备在百度网盘里输入账号和密码,但是总是输入到账号框或者密码框,最后发现原来是光标在账号框或者密码框,问题原因发现了那就好解决了,在输入账号时先将光标定位到账号框,输入密码时,再将光标定位到密码框就好了,实现的方式又有很多种,介绍我用的方式:
/*将光标定位p1.x,p1.y位置*/
SendMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(p1.x, p1.y));//鼠标按下
Sleep(50);
if (SendMessage(hwnd, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(p1.x, p1.y)) != 0)//鼠标松开
{
cout << "触发左键单击按钮失败" << endl;
}
/*输入账号*/
for (size_t i = 0; i < wcslen(msg); i++)
{
Sleep(50);//延时可防止数据丢失
if (SendMessageW(hwnd, WM_IME_CHAR, msg[i], MAKELPARAM(p1.x,p1.y)) != 0)//返回值为0,表示发送成功
{
cout << "消息发送失败" << endl;
}
}
/*将光标定位p2.x,p2.y位置*/
SendMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(p2.x, p2.y));//鼠标按下
Sleep(50);
if (SendMessage(hwnd, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(p2.x, p2.y)) != 0)//鼠标松开
{
cout << "触发左键单击按钮失败" << endl;
}
/*输入密码*/
for (size_t i = 0; i < wcslen(msg1); i++)
{
Sleep(50);//延时可防止数据丢失
if (SendMessageW(hwnd, WM_IME_CHAR, msg1[i], MAKELPARAM(p2.x, p2.y)) != 0)//返回值为0,表示发送成功
{
cout << "消息发送失败" << endl;
}
}
2020/5/7:终于解决了第二个问题了,原来p3.x和p3.y是获取按钮在当前屏幕的位置,但是SendMessage第四个参数应该指的是按钮相对于第一个参数(也是窗口)的坐标,为此增加两行代码:
GetWindowRect(childHq, &rect);//获取chileHq窗口的位置
p[2].x = p[2].x - rect.left;
p[2].y = p[2].y - rect.top;
这样重新得到的p[2]就是相对于窗口的坐标了
以下是原文
需求是向一个应用程序的两个文本框输入字符串,然后点击确定。
应用程序用SPY++只能找到最外边的窗口句柄,文本框和确定按钮都不能找到句柄。
所以打算是用seedmessage给指定坐标发送消息。但是现在有两个问题:
1.SendMessageW(hwnd, WM_IME_CHAR, msg[i], MAKELPARAM(p1.x,p1.y)) 只能发送到一个文本框,好像和最后坐标参数无关,不知道此法是否可行;
2. SendMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(p3.x, p3.y))发送指定坐标的左键单击操作也没有反应,但是用spy++监控,确实在按钮坐标发生了鼠标左键单击情况。
也不知道问题出在那里,希望有高人指点一下。
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME)&0x8000) ? 1:0)
void Send(HWND hwnd, POINT p1,POINT p2,POINT p3);
int main(int argc, char* argv[])
{
HWND childHq = FindWindowEx(NULL, NULL, "ChatWnd", "文件传输助手");
if (childHq == NULL)
{
cout << "没有找到窗口!" << endl;
}
/*单击右键获取三次鼠标坐标*/
POINT p[3];
cout << "请在要发送消息的位置单击右键,获取坐标" << endl;
for (int i = 0; i < 3; i++)
{
while (1)
{
if (KEY_DOWN(VK_RBUTTON))
{
GetCursorPos(&p[i]);//获取当前坐标
break;
}
}
cout << "坐标是:" << p[i].x << "," << p[i].y << ";" << endl;
Sleep(500);
}
/*发送消息*/
Sleep(100);
thread t(Send, childHq, p[0], p[1], p[2]);//创建带参子线程
t.join();
system("PAUSE");
return 0;
}
void Send(HWND hwnd, POINT p1,POINT p2,POINT p3)
{
wchar_t msg[] = L"11111";
wchar_t msg1[] = L"22222";
for (size_t i = 0; i < wcslen(msg); i++)
{
Sleep(50);//延时可防止数据丢失
if (SendMessageW(hwnd, WM_IME_CHAR, msg[i], MAKELPARAM(p1.x,p1.y)) != 0)//返回值为0,表示发送成功
{
cout << "消息发送失败" << endl;
}
}
for (size_t i = 0; i < wcslen(msg1); i++)
{
Sleep(50);//延时可防止数据丢失
if (SendMessageW(hwnd, WM_IME_CHAR, msg1[i], MAKELPARAM(p2.x, p2.y)) != 0)//返回值为0,表示发送成功
{
cout << "消息发送失败" << endl;
}
}
/*发送点击按钮消息*/
SendMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(p3.x, p3.y));
Sleep(500);
if (SendMessage(hwnd, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(p3.x, p3.y)) != NULL)
{
cout << "触发左键单击按钮失败" << endl;
}
}
既然是文本框,为什么不直接用 wm_settext