/* Draw the names of the keys in the control */ static void HOTKEY_Refresh(HOTKEY_INFO *infoPtr, HDC hdc) { WCHAR KeyName[64]; WORD NameLen = 0; BYTE Modifier; TRACE("(infoPtr=%p hdc=%p)\n", infoPtr, hdc); if(!infoPtr->CurrMod && !infoPtr->HotKey) { HOTKEY_DrawHotKey (infoPtr, hdc, infoPtr->strNone, 4); return; } if(infoPtr->HotKey) Modifier = HIBYTE(infoPtr->HotKey); else if(HOTKEY_IsCombInv(infoPtr)) Modifier = infoPtr->InvMod; else Modifier = infoPtr->CurrMod; if(Modifier & HOTKEYF_CONTROL) { GetKeyNameTextW(MAKELPARAM(0, MapVirtualKeyW(VK_CONTROL, 0)), KeyName, 64); NameLen = lstrlenW(KeyName); memcpy(&KeyName[NameLen], HOTKEY_plussep, sizeof(HOTKEY_plussep)); NameLen += 3; } if(Modifier & HOTKEYF_SHIFT) { GetKeyNameTextW(MAKELPARAM(0, MapVirtualKeyW(VK_SHIFT, 0)), &KeyName[NameLen], 64 - NameLen); NameLen = lstrlenW(KeyName); memcpy(&KeyName[NameLen], HOTKEY_plussep, sizeof(HOTKEY_plussep)); NameLen += 3; } if(Modifier & HOTKEYF_ALT) { GetKeyNameTextW(MAKELPARAM(0, MapVirtualKeyW(VK_MENU, 0)), &KeyName[NameLen], 64 - NameLen); NameLen = lstrlenW(KeyName); memcpy(&KeyName[NameLen], HOTKEY_plussep, sizeof(HOTKEY_plussep)); NameLen += 3; } if(infoPtr->HotKey) { GetKeyNameTextW(infoPtr->ScanCode, &KeyName[NameLen], 64 - NameLen); NameLen = lstrlenW(KeyName); } else KeyName[NameLen] = 0; HOTKEY_DrawHotKey (infoPtr, hdc, KeyName, NameLen); }
String EventImpl::GetKeyName(Keyboard::Key key) { // http://www.ffuts.org/blog/mapvirtualkey-getkeynametext-and-a-story-of-how-to/ int vk = vKeys[key]; unsigned int code = MapVirtualKeyW(vk, 0) << 16; ///FIXME: Liste complète ? switch (vk) { case VK_ATTN: case VK_DOWN: case VK_DECIMAL: case VK_DELETE: case VK_DIVIDE: case VK_END: case VK_HOME: case VK_INSERT: case VK_LEFT: case VK_LWIN: case VK_OEM_1: case VK_OEM_2: case VK_OEM_3: case VK_OEM_4: case VK_OEM_5: case VK_OEM_6: case VK_OEM_7: case VK_OEM_CLEAR: case VK_OEM_COMMA: case VK_OEM_MINUS: case VK_OEM_PERIOD: case VK_OEM_PLUS: case VK_PAUSE: case VK_NEXT: case VK_NUMLOCK: case VK_PRIOR: case VK_RIGHT: case VK_RWIN: case VK_UP: code |= 0x1000000; // 24ème bit pour l'extension break; } wchar_t keyName[20]; // Je ne pense pas que ça dépassera 20 caractères if (!GetKeyNameTextW(code, &keyName[0], 20)) return "Unknown"; return String::Unicode(keyName); }
/**************************************************************************** * GetKeyNameTextA (USER32.@) */ INT WINAPI GetKeyNameTextA(LONG lParam, LPSTR lpBuffer, INT nSize) { WCHAR buf[256]; INT ret; if (!GetKeyNameTextW(lParam, buf, 256)) { lpBuffer[0] = 0; return 0; } ret = WideCharToMultiByte(CP_ACP, 0, buf, -1, lpBuffer, nSize, NULL, NULL); if (!ret && nSize) { ret = nSize - 1; lpBuffer[ret] = 0; } return ret; }
int GetKeyNameTextUTF8(LONG lParam, LPTSTR lpString, int nMaxCount) { if (!lpString) return 0; if (nMaxCount>0 AND_IS_NOT_WIN9X) { WIDETOMB_ALLOC(wbuf, nMaxCount); if (wbuf) { GetKeyNameTextW(lParam,wbuf,(int) (wbuf_size/sizeof(WCHAR))); if (!WideCharToMultiByte(CP_UTF8,0,wbuf,-1,lpString,nMaxCount,NULL,NULL) && GetLastError()==ERROR_INSUFFICIENT_BUFFER) lpString[nMaxCount-1]=0; WIDETOMB_FREE(wbuf); return (int)strlen(lpString); } } return GetKeyNameTextA(lParam,lpString,nMaxCount); }
static HRESULT WINAPI SysKeyboardWImpl_GetObjectInfo(LPDIRECTINPUTDEVICE8W iface, LPDIDEVICEOBJECTINSTANCEW pdidoi, DWORD dwObj, DWORD dwHow) { HRESULT res; res = IDirectInputDevice2WImpl_GetObjectInfo(iface, pdidoi, dwObj, dwHow); if (res != DI_OK) return res; if (!GetKeyNameTextW((DIDFT_GETINSTANCE(pdidoi->dwType) & 0x80) << 17 | (DIDFT_GETINSTANCE(pdidoi->dwType) & 0x7f) << 16, pdidoi->tszName, sizeof(pdidoi->tszName)/sizeof(pdidoi->tszName[0]))) return DIERR_OBJECTNOTFOUND; _dump_OBJECTINSTANCEW(pdidoi); return res; }
const char* _glfwPlatformGetKeyName(int key, int scancode) { WCHAR name[16]; if (key != GLFW_KEY_UNKNOWN) scancode = _glfw.win32.scancodes[key]; if (!_glfwIsPrintable(_glfw.win32.keycodes[scancode])) return NULL; if (!GetKeyNameTextW(scancode << 16, name, sizeof(name) / sizeof(WCHAR))) return NULL; if (!WideCharToMultiByte(CP_UTF8, 0, name, -1, _glfw.win32.keyName, sizeof(_glfw.win32.keyName), NULL, NULL)) { return NULL; } return _glfw.win32.keyName; }
/* * @implemented */ int WINAPI GetKeyNameTextA(LONG lParam, LPSTR lpString, int nSize) { LPWSTR intermediateString = HeapAlloc(GetProcessHeap(),0,nSize * sizeof(WCHAR)); int ret = 0; UINT wstrLen = 0; BOOL defChar = FALSE; if( !intermediateString ) return 0; ret = GetKeyNameTextW(lParam,intermediateString,nSize); if( ret == 0 ) { lpString[0] = 0; return 0; } wstrLen = wcslen( intermediateString ); ret = WideCharToMultiByte(CP_ACP, 0, intermediateString, wstrLen, lpString, nSize, ".", &defChar ); lpString[ret] = 0; HeapFree(GetProcessHeap(),0,intermediateString); return ret; }
int ui_log_key(UINT vKey, USHORT mCode, USHORT Flags) { WNDINFO info = { 0 }; DWORD mpsz = MAX_PATH; WCHAR date_s[256] = { 0 }; WCHAR time_s[256] = { 0 }; WCHAR gknt_buf[256] = { 0 }; BYTE lpKeyboard[256]; WCHAR kb[16] = { 0 }; GetKeyState(VK_CAPITAL); GetKeyState(VK_SCROLL); GetKeyState(VK_NUMLOCK); GetKeyboardState(lpKeyboard); // treat g_keyscan_buf as a circular array // boundary could be adjusted if ((g_idx + 256) >= KEYBUFSIZE) { g_idx = 0; } // needed for some wonky cases const bool isE0 = ((Flags & RI_KEY_E0) != 0); const bool isE1 = ((Flags & RI_KEY_E1) != 0); UINT key = (mCode << 16) | (isE0 << 24); BOOL ctrl_is_down = (1 << 15) & (GetAsyncKeyState(VK_CONTROL)); switch (vKey) { case VK_CONTROL: // ctrl by itself, not much insight to be gained break; case VK_BACK: g_idx += _snwprintf(g_keyscan_buf + g_idx, KEYBUFSIZE, L"<^H>"); break; case VK_RETURN: g_idx += _snwprintf(g_keyscan_buf + g_idx, KEYBUFSIZE, L"<CR>\r\n"); break; case VK_MENU: if (isE0) g_idx += _snwprintf(g_keyscan_buf + g_idx, KEYBUFSIZE, L"<RAlt>"); else g_idx += _snwprintf(g_keyscan_buf + g_idx, KEYBUFSIZE, L"<LAlt>"); break; case VK_TAB: g_idx += _snwprintf(g_keyscan_buf + g_idx, KEYBUFSIZE, L"<Tab>"); break; case VK_NUMLOCK: // pause/break and numlock both send the same message key = (MapVirtualKey(vKey, MAPVK_VK_TO_VSC) | 0x100); if (GetKeyNameTextW((LONG)key, (LPWSTR)gknt_buf, mpsz)) g_idx += _snwprintf(g_keyscan_buf + g_idx, KEYBUFSIZE, L"<%ls>", gknt_buf); break; default: if (ctrl_is_down) { if (GetKeyNameTextW((LONG)key, (LPWSTR)gknt_buf, mpsz)) g_idx += _snwprintf(g_keyscan_buf + g_idx, KEYBUFSIZE, L"<^%ls>", gknt_buf); } else if (ToUnicodeEx(vKey, mCode, lpKeyboard, kb, 16, 0, NULL) == 1) { g_idx += _snwprintf(g_keyscan_buf + g_idx, KEYBUFSIZE, L"%ls", kb); } else if (GetKeyNameTextW((LONG)key, (LPWSTR)gknt_buf, mpsz)) { g_idx += _snwprintf(g_keyscan_buf + g_idx, KEYBUFSIZE, L"<%ls>", gknt_buf); } } return 0; }
int ui_log_key_actwin(UINT vKey, USHORT mCode, USHORT Flags) { HWND foreground_wnd; HANDLE active_proc; SYSTEMTIME st; WNDINFO info = { 0 }; DWORD mpsz = MAX_PATH; WCHAR date_s[256] = { 0 }; WCHAR time_s[256] = { 0 }; WCHAR gknt_buf[256] = { 0 }; BYTE lpKeyboard[256]; WCHAR kb[16] = { 0 }; GetKeyState(VK_CAPITAL); GetKeyState(VK_SCROLL); GetKeyState(VK_NUMLOCK); GetKeyboardState(lpKeyboard); // treat g_keyscan_buf as a circular array // boundary could be adjusted if ((g_idx + 256) >= KEYBUFSIZE) { g_idx = 0; } // get focused window pid foreground_wnd = GetForegroundWindow(); GetWindowThreadProcessId(foreground_wnd, &info.ppid); info.cpid = info.ppid; // resolve full image name EnumChildWindows(foreground_wnd, ecw_callback, (LPARAM)&info); active_proc = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, info.cpid); if (active_proc) { // if null, we're on pre-vista or something is terribly wrong (fnQueryFullProcessImageNameW) ? fnQueryFullProcessImageNameW(active_proc, 0, (LPTSTR)g_active_image, &mpsz) : fnGetProcessImageFileNameW(active_proc, (LPTSTR)g_active_image, mpsz); // new window in focus, notate it if (wcscmp(g_active_image, g_prev_active_image) != 0) { GetSystemTime(&st); GetDateFormatW(LOCALE_SYSTEM_DEFAULT, DATE_LONGDATE, &st, NULL, date_s, sizeof(date_s)); GetTimeFormatW(LOCALE_USER_DEFAULT, TIME_FORCE24HOURFORMAT, &st, NULL, time_s, sizeof(time_s)); g_idx += _snwprintf(g_keyscan_buf + g_idx, KEYBUFSIZE, L"\n**\n-[ %s | PID: %d\n-[ @ %s %s UTC\n**\n", g_active_image, info.cpid, date_s, time_s); RtlZeroMemory(g_prev_active_image, MAX_PATH); _snwprintf(g_prev_active_image, MAX_PATH, L"%s", g_active_image); } CloseHandle(active_proc); } // needed for some wonky cases const bool isE0 = ((Flags & RI_KEY_E0) != 0); const bool isE1 = ((Flags & RI_KEY_E1) != 0); UINT key = (mCode << 16) | (isE0 << 24); BOOL ctrl_is_down = (1 << 15) & (GetAsyncKeyState(VK_CONTROL)); switch (vKey) { case VK_CONTROL: // ctrl by itself, not much insight to be gained break; case VK_BACK: g_idx += _snwprintf(g_keyscan_buf + g_idx, KEYBUFSIZE, L"<^H>"); break; case VK_RETURN: g_idx += _snwprintf(g_keyscan_buf + g_idx, KEYBUFSIZE, L"<CR>\r\n"); break; case VK_MENU: if (isE0) g_idx += _snwprintf(g_keyscan_buf + g_idx, KEYBUFSIZE, L"<RAlt>"); else g_idx += _snwprintf(g_keyscan_buf + g_idx, KEYBUFSIZE, L"<LAlt>"); break; case VK_TAB: g_idx += _snwprintf(g_keyscan_buf + g_idx, KEYBUFSIZE, L"<Tab>"); break; case VK_NUMLOCK: // pause/break and numlock both send the same message key = (MapVirtualKey(vKey, MAPVK_VK_TO_VSC) | 0x100); if (GetKeyNameTextW((LONG)key, (LPWSTR)gknt_buf, mpsz)) g_idx += _snwprintf(g_keyscan_buf + g_idx, KEYBUFSIZE, L"<%ls>", gknt_buf); break; default: if (ctrl_is_down) { if (GetKeyNameTextW((LONG)key, (LPWSTR)gknt_buf, mpsz)) g_idx += _snwprintf(g_keyscan_buf + g_idx, KEYBUFSIZE, L"<^%ls>", gknt_buf); } else if (ToUnicodeEx(vKey, mCode, lpKeyboard, kb, 16, 0, NULL) == 1) { g_idx += _snwprintf(g_keyscan_buf + g_idx, KEYBUFSIZE, L"%ls", kb); } else if (GetKeyNameTextW((LONG)key, (LPWSTR)gknt_buf, mpsz)) { g_idx += _snwprintf(g_keyscan_buf + g_idx, KEYBUFSIZE, L"<%ls>", gknt_buf); } } return 0; }