#define _UNICODE #define UNICODE // package #include "Workflow.h" // windows #include // C #include LPCTSTR GetClipboard() { LPCTSTR _contents; OpenClipboard(0); if (IsClipboardFormatAvailable(CF_UNICODETEXT)) { HGLOBAL hMem = GetClipboardData(CF_UNICODETEXT); // TODO CF_UNICODETEXT _contents = (LPCTSTR)GlobalLock(hMem); // lpctstr or lpcwstr? GlobalUnlock(hMem); } else if (IsClipboardFormatAvailable(CF_TEXT)) { // or ascii, and convert to widechar _contents = TEXT(""); } else { _contents = TEXT(""); } CloseClipboard(); return _contents; } void SetClipboard(LPCTSTR output) { const size_t len = (lstrlen(output) + 1) * sizeof(wchar_t); // was halving HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len); memcpy(GlobalLock(hMem), output, len); GlobalUnlock(hMem); OpenClipboard(0); EmptyClipboard(); SetClipboardData(CF_UNICODETEXT, hMem); CloseClipboard(); } UINT SendUnicodeChar(const wchar_t c) { UINT successes = 0; INPUT i; i.type = INPUT_KEYBOARD; i.ki.time = 0; i.ki.dwExtraInfo = 0; i.ki.wVk = 0; i.ki.dwFlags = KEYEVENTF_UNICODE; // Specify the key as a unicode character i.ki.wScan = c; // successes += SendInput(1, &i, sizeof(INPUT)); return successes; } /* */ UINT PressKeyDown(WORD key) { INPUT i; i.type = INPUT_KEYBOARD; i.ki.wScan = 0; i.ki.time = 0; i.ki.dwExtraInfo = 0; i.ki.wVk = key; i.ki.dwFlags = KEYEVENTF_KEYDOWN; return SendInput(1, &i, sizeof(INPUT)); } /* */ UINT PressKeyUp(WORD key) { INPUT i; i.type = INPUT_KEYBOARD; i.ki.wScan = 0; i.ki.time = 0; i.ki.dwExtraInfo = 0; i.ki.wVk = key; i.ki.dwFlags = KEYEVENTF_KEYUP; return SendInput(1, &i, sizeof(INPUT)); } UINT ClickMouseAt(int x, int y, int n, DWORD buttonDown, DWORD buttonUp) { UINT successes = 0; //TODO? SendMessage(NULL, BM_CLICK, 0, 0); const double XSCALEFACTOR = 65535 / (GetSystemMetrics(SM_CXSCREEN) - 1); const double YSCALEFACTOR = 65535 / (GetSystemMetrics(SM_CYSCREEN) - 1); POINT cursorPos; GetCursorPos(&cursorPos); double cx = cursorPos.x * XSCALEFACTOR; double cy = cursorPos.y * YSCALEFACTOR; //TODO why SCALEFACTOR? double nx = x * XSCALEFACTOR; double ny = y * YSCALEFACTOR; INPUT i = { 0 }; i.type = INPUT_MOUSE; i.mi.dx = (LONG)nx; i.mi.dy = (LONG)ny; i.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE | buttonDown | buttonUp; // click mouse down and then up for (int j = 0; j < n; j++) { successes += SendInput(1, &i, sizeof(INPUT)); } i.mi.dx = (LONG)cx; i.mi.dy = (LONG)cy; i.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE; // move mouse back successes += SendInput(1, &i, sizeof(INPUT)); return successes; } /* wheel is {MOUSEEVENTF_WHEEL, MOUSEEVENTF_HWHEEL} direction is {+1, -1} i.e. {forwards, backwards} i.e. {towards you, away from you} */ UINT ScrollMouseWheel(DWORD wheel, DWORD direction, DWORD distance) { // mouse_event(MOUSEEVENTF_WHEEL, 0, 0, direction * distance, 0); INPUT i; i.type = INPUT_MOUSE; i.mi.dx = 0; i.mi.dy = 0; i.mi.time = 0; // otherwise monitor falls asleep, because the last mouse event is said to be some large number (garbage memory). i.mi.dwExtraInfo = 0; i.mi.dwFlags = wheel; // MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE i.mi.mouseData = direction * distance; return SendInput(1, &i, sizeof(INPUT)); } /* uses the PATH? */ HINSTANCE OpenApplication(LPCTSTR app) { return ShellExecute(NULL, L"open", app, NULL, NULL, SW_SHOW); } HINSTANCE OpenUrl(LPCTSTR url) { return ShellExecute(NULL, L"open", url, NULL, NULL, SW_SHOWNORMAL); } BOOL EnableDebugPriv() { HANDLE hToken; LUID luid; TOKEN_PRIVILEGES tkp; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid); tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = luid; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; BOOL wasAdjsuted = AdjustTokenPrivileges(hToken, 0, &tkp, sizeof(tkp), NULL, NULL); // ""'false' undeclared" CloseHandle(hToken); return wasAdjsuted; }