void simulateKeyRelease(unsigned int key) { if(!key) return; INPUT ip = { 0 }; if(key == VK_LBUTTON || key == VK_RBUTTON) { ip.type = INPUT_MOUSE; ip.mi.dwFlags = key == VK_LBUTTON ? MOUSEEVENTF_LEFTUP : MOUSEEVENTF_RIGHTUP; } else { ip.type = INPUT_KEYBOARD; ip.ki.wScan = mapVirtualKey(key); ip.ki.time = 0; ip.ki.dwExtraInfo = 0; ip.ki.wVk = 0; ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP; } SendInput(1, &ip, sizeof(INPUT)); }
void simulateKeyNewpress(unsigned int key) { if(!key) return; unsigned char unshift = 0; INPUT ip = { 0 }; if(key == VK_LBUTTON || key == VK_RBUTTON) { ip.type = INPUT_MOUSE; ip.mi.dwFlags = key == VK_LBUTTON ? MOUSEEVENTF_LEFTDOWN : MOUSEEVENTF_RIGHTDOWN; } else { if(key == '!') { key = '1'; simulateKeyNewpress(VK_SHIFT); unshift = 1; } else if(key == '?') { key = VK_DIVIDE; simulateKeyNewpress(VK_SHIFT); unshift = 1; } else if(key == '-') key = VK_OEM_MINUS; else if(key == ',') key = VK_OEM_COMMA; else if(key == '\13') key = VK_RETURN; ip.type = INPUT_KEYBOARD; ip.ki.wScan = mapVirtualKey(key); ip.ki.time = 0; ip.ki.dwExtraInfo = 0; ip.ki.wVk = 0; ip.ki.dwFlags = KEYEVENTF_SCANCODE; } SendInput(1, &ip, sizeof(INPUT)); if(unshift) simulateKeyRelease(VK_SHIFT); }
LONG WINAPI WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { poWindow *win = (poWindow*)GetWindowLongPtr(hwnd, GWL_USERDATA); switch(uMsg) { case WM_DESTROY: PostQuitMessage(0); break; case WM_SIZE: window_width = LOWORD(lParam); window_height = HIWORD(lParam); if(win) win->resized(0,0,window_width,window_height); break; case WM_RBUTTONDOWN: ::SetCapture(hwnd); isDragging = true; if(win) win->mouseDown(LOSHORT(lParam), HISHORT(lParam), 0); break; case WM_RBUTTONUP: ::ReleaseCapture(); isDragging = false; if(win) win->mouseUp(LOSHORT(lParam), HISHORT(lParam), 0); break; case WM_LBUTTONDOWN: ::SetCapture(hwnd); isDragging = true; if(win) win->mouseDown(LOSHORT(lParam), HISHORT(lParam), 0); break; case WM_LBUTTONUP: ::ReleaseCapture(); isDragging = false; if(win) win->mouseUp(LOSHORT(lParam), HISHORT(lParam), 0); break; case WM_MBUTTONDOWN: ::SetCapture(hwnd); isDragging = true; if(win) win->mouseDown(LOSHORT(lParam), HISHORT(lParam), 0); break; case WM_MBUTTONUP: ::ReleaseCapture(); isDragging = false; if(win) win->mouseUp(LOSHORT(lParam), HISHORT(lParam), 0); break; case WM_MOUSEMOVE: if( isDragging ) if(win) win->mouseDrag(LOSHORT(lParam), HISHORT(lParam), 0); else if(win) win->mouseMove(LOSHORT(lParam), HISHORT(lParam), 0); break; case WM_MOUSEWHEEL: break; case WM_SYSKEYDOWN: { // alt-f4 ... pass to close the window bool alt_down = (GetKeyState(VK_LMENU) & 0x80) || (GetKeyState(VK_RMENU) & 0x80) || (GetKeyState(VK_MENU) & 0x80); if(VK_F4 == wParam && alt_down) { PostMessage(hwnd, WM_CLOSE, 0, 0); break; } } case WM_KEYDOWN: if(VK_F1 == wParam) doFullscreen(hwnd, !is_fullscreen); else if(win) win->keyDown(mapVirtualKey(wParam), wParam, getKeyModifiers()); break; case WM_SYSKEYUP: case WM_KEYUP: if(win) win->keyUp(mapVirtualKey(wParam), wParam, getKeyModifiers()); break; case WM_KILLFOCUS: // if we lose capture during a drag, post a mouse up event as a notifier if( isDragging ) { if(win) win->mouseDrag(LOSHORT(lParam), HISHORT(lParam), 0); } isDragging = false; break; case WM_ACTIVATE: // make sure our fullscreen window plays nice with the task switcher if(is_fullscreen) { // if we're loosing focus, minimize to system tray bool is_deactivated = WA_INACTIVE == LOWORD(wParam); if(is_deactivated) ShowWindow(hwnd,SW_SHOWMINIMIZED); else // sw_showmaximized flashes the title bar // sw_show flashes the system tray, go figure ShowWindow(hwnd,SW_SHOWMAXIMIZED); } break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; }