X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9b7e022676582feadfcce349d66a52be88121ac7..0a9c5e3564ed35162bb8cab5af62a98405364fb8:/src/msw/uiaction.cpp diff --git a/src/msw/uiaction.cpp b/src/msw/uiaction.cpp index d421b9a18f..293cf51078 100644 --- a/src/msw/uiaction.cpp +++ b/src/msw/uiaction.cpp @@ -1,11 +1,13 @@ ///////////////////////////////////////////////////////////////////////////// // Name: src/msw/uiaction.cpp // Purpose: wxUIActionSimulator implementation -// Author: Kevin Ollivier +// Author: Kevin Ollivier, Steven Lamerton, Vadim Zeitlin // Modified by: // Created: 2010-03-06 -// RCS-ID: $Id: menu.cpp 54129 2008-06-11 19:30:52Z SC $ +// RCS-ID: $Id$ // Copyright: (c) Kevin Ollivier +// (c) 2010 Steven Lamerton +// (c) 2010 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -14,35 +16,38 @@ #if wxUSE_UIACTIONSIMULATOR #include "wx/uiaction.h" - +#include "wx/window.h" //for wxCharCodeWXToMSW #include "wx/msw/wrapwin.h" +namespace +{ + DWORD EventTypeForMouseButton(int button, bool isDown) { switch (button) { case wxMOUSE_BTN_LEFT: - if (isDown) - return MOUSEEVENTF_LEFTDOWN; - else - return MOUSEEVENTF_LEFTUP; + return isDown ? MOUSEEVENTF_LEFTDOWN : MOUSEEVENTF_LEFTUP; + case wxMOUSE_BTN_RIGHT: - if (isDown) - return MOUSEEVENTF_RIGHTDOWN; - else - return MOUSEEVENTF_RIGHTUP; + return isDown ? MOUSEEVENTF_RIGHTDOWN : MOUSEEVENTF_RIGHTUP; + case wxMOUSE_BTN_MIDDLE: - if (isDown) - return MOUSEEVENTF_MIDDLEDOWN; - else - return MOUSEEVENTF_MIDDLEUP; + return isDown ? MOUSEEVENTF_MIDDLEDOWN : MOUSEEVENTF_MIDDLEUP; default: wxFAIL_MSG("Unsupported button passed in."); - return -1; + return (DWORD)-1; } } +void DoSimulateKbdEvent(DWORD vk, bool isDown) +{ + keybd_event(vk, 0, isDown ? 0 : KEYEVENTF_KEYUP, 0); +} + +} // anonymous namespace + bool wxUIActionSimulator::MouseDown(int button) { POINT p; @@ -53,7 +58,13 @@ bool wxUIActionSimulator::MouseDown(int button) bool wxUIActionSimulator::MouseMove(long x, long y) { - mouse_event(MOUSEEVENTF_MOVE, x, y, 0, 0); + // Because MOUSEEVENTF_ABSOLUTE takes measurements scaled between 0 & 65535 + // we need to scale our input too + int displayx, displayy, scaledx, scaledy; + wxDisplaySize(&displayx, &displayy); + scaledx = ((float)x / displayx) * 65535; + scaledy = ((float)y / displayy) * 65535; + mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, scaledx, scaledy, 0, 0); return true; } @@ -65,12 +76,31 @@ bool wxUIActionSimulator::MouseUp(int button) return true; } -bool wxUIActionSimulator::Key(int keycode, bool isDown, bool shiftDown, bool cmdDown, bool altDown) +bool wxUIActionSimulator::DoKey(int keycode, int modifiers, bool isDown) { - DWORD flags = 0; + if (isDown) + { + if (modifiers & wxMOD_SHIFT) + DoSimulateKbdEvent(VK_SHIFT, true); + if (modifiers & wxMOD_ALT) + DoSimulateKbdEvent(VK_MENU, true); + if (modifiers & wxMOD_CMD) + DoSimulateKbdEvent(VK_CONTROL, true); + } + + DWORD vkkeycode = wxCharCodeWXToMSW(keycode); + keybd_event(vkkeycode, 0, isDown ? 0 : KEYEVENTF_KEYUP, 0); + if (!isDown) - flags = KEYEVENTF_KEYUP; - keybd_event(keycode, 0, flags, 0); + { + if (modifiers & wxMOD_SHIFT) + DoSimulateKbdEvent(VK_SHIFT, false); + if (modifiers & wxMOD_ALT) + DoSimulateKbdEvent(VK_MENU, false); + if (modifiers & wxMOD_CMD) + DoSimulateKbdEvent(VK_CONTROL, false); + } + return true; }