sendmessage发送消息问题

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