主要思路是 拿到顶层窗口句柄 ,向顶层窗口(键盘焦点所在处)传递消息
//拿到鼠标所在窗口句柄 基本所有窗口句柄可以
POINT point;
GetCursorPos(&point);
HWND hdl_other = WindowFromPoint(point);
//拿到顶层窗口句柄 部分窗口句柄拿不到 qq chrome等
//HWND hwnd = GetForegroundWindow();
//GUITHREADINFO pg;
//pg.cbSize = 48;
//GetGUIThreadInfo(NULL, &pg);
//hwnd = pg.hwndCaret;
for (size_t i = 2; i < len+2; i++)
{
int result = ::SendMessageA(hdl_other, WM_CHAR, (WPARAM)tmp[i], 0);
//int result = ::SendMessageA(hwnd, WM_CHAR, (WPARAM)tmp[i], 0);
//int result = ::SendMessage(hwnd, WM_CHAR, (WPARAM)tmp[i], 0);
if (result)
{
printf("successed\n");
}
}
遇到过几个问题
1.看网上SendMessage形参中 wParam 是无用的,lParam是有用的,于是一直把字符放到lParam中,一直失败,放在wParam成功了
查阅网上的
用的是WM_SETTEXT 不知道怎么做到输出字符串成功的 我不知道原因
2.包含中文字符串 出现乱码问题 各种尝试 最后用SendMessageA解决了
我项目环境是unicode,默认SendMessage 是走SendMessageW 不走SendMessageA
查资料得到 SendMessgaW是对unicode编码字符的传递
SendMessageA是对ACII编码的字符的传递
前提:tmp是用gb2312字节编码的 我不知道有没有影响
3.部分窗口例如 qq,chrome等程序句柄 无法通过GetForegroundWindown拿不到?
解决办法:使用鼠标拿到鼠标座标当前所在窗口的句柄
POINT point;
GetCursorPos(&point);
HWND hdl_other = WindowFromPoint(point);
int result = ::SendMessageA(hdl_other, WM_CHAR, (WPARAM)tmp[i], 0);