【发布时间】:2014-09-06 03:17:21
【问题描述】:
搜索此站点时,我看到其他人在使用 ToUnicode 函数时遇到了同样的问题,并导致了双重音。我的代码删除不重要部分的示例:
在我的cpp文件中(窗口已经带有创建函数CreateWindowsEx):
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:{
//keyboard
rid[0].dwFlags = RIDEV_NOLEGACY |RIDEV_INPUTSINK;
rid[0].usUsagePage = 1;
rid[0].usUsage = 6;
rid[0].hwndTarget = hWnd;
//mouse
rid[1].dwFlags = RIDEV_NOLEGACY |RIDEV_INPUTSINK;
rid[1].usUsagePage = 1;
rid[1].usUsage = 2;
rid[1].hwndTarget = hWnd;
RegisterRawInputDevices(rid,2,sizeof(rid[0]));
}
case WM_INPUT:
KeyProcess(message,lParam);
break;
在我的 dll 文件中:
LRESULT CALLBACK KeyProcess(UINT msg, LPARAM lParam)
{
LPBYTE lpb = nullptr;
switch (msg)
{
case WM_INPUT:
if(GetRawInputData((HRAWINPUT)lParam,RID_INPUT,NULL,&dwSize,sizeof(RAWINPUTHEADER))==-1){
break;
}
lpb = (LPBYTE)GlobalAlloc(GMEM_FIXED, dwSize);
if(lpb==NULL){
break;
}
if(GetRawInputData((HRAWINPUT)lParam,RID_INPUT,lpb,&dwSize,sizeof(RAWINPUTHEADER))!=dwSize){
GlobalFree(lpb);
break;
}
PRAWINPUT raw=(PRAWINPUT)lpb;
if(raw->header.dwType == RIM_TYPEKEYBOARD)
{
UINT Event;
raw->data.keyboard.MakeCode;
raw->data.keyboard.Flags;
raw->data.keyboard.Reserved;
raw->data.keyboard.ExtraInformation;
raw->data.keyboard.Message;
raw->data.keyboard.VKey;
Event = raw->data.keyboard.Message;
if(Event == WM_KEYDOWN)
{
int ta = ToUnicode(raw->data.keyboard.VKey,raw->data.keyboard.MakeCode,
bChar,&wChar,1,0);
ta = ToUnicode(raw->data.keyboard.VKey,raw->data.keyboard.MakeCode,
bChar,&wChar,1,0);
其中 bChar 是 BYTE bChar[256] 而 wChar 是 WCHAR wChar;
根据我读到的内容,解决方案是调用两次 ToUnicode 函数,以便在键入时,例如移过字符“6”(重音“¨”德语变音符号),然后是字符“e”,我会结果是字符“ë”。 如果我只调用一次函数,生成的是双德语变音符号,但调用函数两次,重音会放在字符串上,但不会出现在记事本中,好像键有缺陷。当执行程序停止键的行为恢复正常。我究竟做错了什么?我已经测试过:
if (ta == -1) break;
无论有没有测试总是同样的错误。用鼠标一切都按预期工作,但键盘是没有尝试过的。
【问题讨论】:
标签: c++ windows unicode keyboard