c++ 實現不在同一程序內,在光標處(當前有焦點的窗體輸入框)輸入字符

主要思路是 拿到頂層窗口句柄 ,向頂層窗口(鍵盤焦點所在處)傳遞消息

//拿到鼠標所在窗口句柄 基本所有窗口句柄可以
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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章