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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章