主要思路是 拿到頂層窗口句柄 ,向頂層窗口(鍵盤焦點所在處)傳遞消息
//拿到鼠標所在窗口句柄 基本所有窗口句柄可以
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);