• 5570阅读
  • 8回复

[讨论]Qt::Key转换为Windows键盘消息 [复制链接]

上一主题 下一主题
离线xpsheng
 

只看楼主 倒序阅读 楼主  发表于: 2013-03-23
需要将Qt::Key转换成键盘消息输出,采用如下的方式
Qt::Key keyBuf = Qt::Key(m_byArRecvBuffer.at(i));
PostMessage(h,WM_KEYDOWN, (WPARAM)keyBuf, (LPARAM)NULL);
但发现除了0~9,其他的字母字符,标点都不对
然后采取了将Qt keycode转换成虚拟按键的方式按照下面的思路
http://www.opensource.apple.com/source/WebCore/WebCore-514/platform/qt/PlatformKeyboardEventQt.cpp
windowsKeyCodeForKeyEvent()
发现仍不能将所有的ASCII码转成对应的Windows键盘消息输出
大写字母如何解决?


本人学Qt不久,请各位大侠帮忙指明思路

离线realfan

只看该作者 1楼 发表于: 2013-03-25
用 SendInput 吧
离线realfan

只看该作者 2楼 发表于: 2013-03-25
这里给你段示例,比如模拟输入“A"
    
#include <windows.h>
#include <winable.h>

    INPUT in[1];
    memset(in, 0, 1 * sizeof(INPUT));
    in[0].type = INPUT_KEYBOARD;
    in[0].ki.dwFlags = 0x0004; //KEYEVENTF_UNICODE;
    in[0].ki.wScan = 'A';
    SendInput(1, in, sizeof(INPUT));
离线彩阳

只看该作者 3楼 发表于: 2013-03-25
回 楼主(xpsheng) 的帖子
不太好回答啊,但是大写字母是一个modifier + 字母而成的。建议看看Qt事件的处理。
上海Qt开发联盟,热忱地欢迎你的加入!
离线xpsheng

只看该作者 4楼 发表于: 2013-03-26
SendInput为正解
有两个地方补充下
1. 结尾符\r\n等处理的时候要用in[0].ki.wVk, 不能用in[0].ki.wScan
2. 每发完一个字符后需要把in[0].ki.dwFlags 改为 0x0002; //KEYEVENTF_KEYUP,并延时几个ms
不然连续而又重复的字符无法输出
离线realfan

只看该作者 5楼 发表于: 2013-03-26
回 3楼(彩阳) 的帖子
如果只是将ASCII码字符转成键盘消息,输出到活动窗口,那
in[0].ki.dwFlags = 0x0004; //KEYEVENTF_UNICODE;
in[0].ki.wScan = 'A';
是最好的。这样可以免除中文输入法开启状态的影响。如果不用wScan,则当模拟‘a'输入,如果当时中文输入法开着,则会变成中文输入的一部分。目标窗口是接收不到‘a‘这个字符的。
wScan就可以绕过输入法
离线彩阳

只看该作者 6楼 发表于: 2013-03-26
回 5楼(realfan) 的帖子
学习一下。
请问这种方法可以处理游戏按键消息吗?
这种方法支持游戏手柄按键的读取吗?
上海Qt开发联盟,热忱地欢迎你的加入!
离线realfan

只看该作者 7楼 发表于: 2013-03-26
回 4楼(xpsheng) 的帖子
是。连续输入确实要特殊处理。否则可能会连续输出第一个字符。
离线realfan

只看该作者 8楼 发表于: 2013-03-26
回 6楼(彩阳) 的帖子
按钮模拟应该是可以的
typedef struct tagINPUT {
  DWORD type;
  union {
    MOUSEINPUT    mi;
    KEYBDINPUT    ki;
    HARDWAREINPUT hi;
  };
} INPUT, *PINPUT;
这里的union可以用鼠标,键盘和其它模拟输入设备。按理说可以吧,没研究过。
快速回复
限100 字节
 
上一个 下一个