c++ 实现不在同一程序内,在光标处(当前有焦点的窗体输入框)输入字符

简介: 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);
相关文章
|
1月前
|
存储 缓存 算法
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
118 0
|
1月前
|
存储 算法 编译器
【C++ 字符数组的模板特化】面向字符串的C++模板特化:理解与实践
【C++ 字符数组的模板特化】面向字符串的C++模板特化:理解与实践
47 1
|
1月前
|
对象存储 C++
在C++语言中字符串流
在C++语言中字符串流
18 2
|
1月前
|
存储 C++ 索引
C++ string容器-字符存取讲解
C++ string容器-字符存取讲解
26 0
|
1月前
|
编译器 C++
c++关键字与三字符组
c++关键字与三字符组
18 0
|
1月前
|
存储 C++
c++字符和不常见常量
c++字符和不常见常量
27 0
|
1月前
|
编译器 Linux C++
3C++程序的编写和实现
3C++程序的编写和实现
20 2
|
1月前
|
C++ 开发者
2C++的程序的构成和书写形式
2C++的程序的构成和书写形式
16 2
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
27天前
|
存储 缓存 C++
C++链表常用的函数编写(增查删改)内附完整程序
C++链表常用的函数编写(增查删改)内附完整程序