主要思路是 拿到顶层窗口句柄 ,向顶层窗口(键盘焦点所在处)传递消息
//拿到鼠标所在窗口句柄 基本所有窗口句柄可以 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);