1 #include "windows_tools.h"
2
3 #if defined(QMC2_OS_WIN)
4
5 #include <psapi.h>
6 #include <stdio.h>
7 #include <io.h>
8 #include <fcntl.h>
9
10 // To ensure correct resolution of symbols, add psapi.lib to LIBS
11 // and compile with -DPSAPI_VERSION=1
12 // (see http://msdn.microsoft.com/en-us/library/ms682623.aspx)
13
14 QString winSearchText;
15 QMap<HWND, QString> winWindowMap;
16 HWND winFoundHandle;
17
winFindProcessHandle(QString procName)18 HANDLE winFindProcessHandle(QString procName)
19 {
20 HANDLE processHandle = 0;
21 DWORD procs[QMC2_WIN_MAX_PROCS], bytesNeeded;
22 if ( EnumProcesses(procs, sizeof(procs), &bytesNeeded) ) {
23 DWORD numProcesses = bytesNeeded / sizeof(DWORD);
24 for (uint i = 0; i < numProcesses; i++) {
25 HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, procs[i]);
26 if ( hProcess != 0 ) {
27 HMODULE hMod;
28 DWORD bN;
29 if ( EnumProcessModules(hProcess, &hMod, sizeof(hMod), &bN) ) {
30 TCHAR processName[MAX_PATH];
31 GetModuleBaseName(hProcess, hMod, processName, sizeof(processName)/sizeof(TCHAR));
32 #ifdef UNICODE
33 QString pN(QString::fromUtf16((ushort*)processName));
34 #else
35 QString pN(QString::fromLocal8Bit(processName));
36 #endif
37 if ( pN == procName ) {
38 processHandle = hProcess;
39 CloseHandle(hProcess);
40 break;
41 }
42 }
43 CloseHandle(hProcess);
44 }
45 }
46 }
47
48 return processHandle;
49 }
50
winFindWindowHandleCallbackProc(HWND hwnd,LPARAM lParam)51 BOOL CALLBACK winFindWindowHandleCallbackProc(HWND hwnd, LPARAM lParam)
52 {
53 WCHAR winTitle[QMC2_WIN_MAX_NAMELEN];
54 if ( !GetWindow(hwnd, GW_OWNER) ) {
55 GetWindowText(hwnd, winTitle, QMC2_WIN_MAX_NAMELEN - 1);
56 QString windowTitle = QString::fromWCharArray(winTitle);
57 if ( windowTitle == winSearchText )
58 winFoundHandle = hwnd;
59 winWindowMap[hwnd] = windowTitle;
60 }
61 return true;
62 }
63
winFindWindowHandle(QString windowTitle)64 HWND winFindWindowHandle(QString windowTitle)
65 {
66 winFoundHandle = 0;
67 winSearchText = windowTitle;
68 winWindowMap.clear();
69 EnumWindows((WNDENUMPROC)winFindWindowHandleCallbackProc, 0);
70 return winFoundHandle;
71 }
72
winRefreshWindowMap()73 void winRefreshWindowMap()
74 {
75 winFindWindowHandle("DUMMY");
76 }
77
winFindWindowHandleOfProcess(Q_PID processInfo,QString subString)78 HWND winFindWindowHandleOfProcess(Q_PID processInfo, QString subString)
79 {
80 bool handleFound = false;
81 HWND windowHandle = GetTopWindow(0);
82 DWORD pid;
83 while ( windowHandle && !handleFound ) {
84 GetWindowThreadProcessId(windowHandle, &pid);
85 if ( pid == processInfo->dwProcessId ) {
86 if ( !subString.isEmpty() ) {
87 WCHAR winTitle[QMC2_WIN_MAX_NAMELEN];
88 GetWindowText(windowHandle, winTitle, QMC2_WIN_MAX_NAMELEN - 1);
89 QString windowTitle = QString::fromWCharArray(winTitle);
90 if ( windowTitle.contains(subString) )
91 handleFound = true;
92 } else
93 handleFound = true;
94 }
95 if ( !handleFound )
96 windowHandle = GetNextWindow(windowHandle, GW_HWNDNEXT);
97 }
98 return handleFound ? windowHandle : 0;
99 }
100
winAllocConsole(bool parentOnly)101 void winAllocConsole(bool parentOnly)
102 {
103 bool parentConsoleAttached = true;
104 if ( !AttachConsole(ATTACH_PARENT_PROCESS) ) {
105 if ( !parentOnly ) {
106 AllocConsole();
107 parentConsoleAttached = false;
108 } else
109 return;
110 }
111
112 HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);
113 int hCrt = _open_osfhandle((intptr_t) handle_out, _O_TEXT);
114 FILE *hf_out = _fdopen(hCrt, "w");
115 setvbuf(hf_out, 0, _IONBF, 1);
116 *stdout = *hf_out;
117
118 HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);
119 hCrt = _open_osfhandle((intptr_t) handle_in, _O_TEXT);
120 FILE *hf_in = _fdopen(hCrt, "r");
121 setvbuf(hf_in, 0, _IONBF, 128);
122 *stdin = *hf_in;
123
124 if ( parentConsoleAttached ) {
125 printf("\n");
126 fflush(stdout);
127 }
128 }
129
winFreeConsole()130 void winFreeConsole()
131 {
132 FreeConsole();
133 }
134
winGetMemoryInfo(quint64 * totalSize,quint64 * totalUsed,quint64 * totalFree)135 void winGetMemoryInfo(quint64 *totalSize, quint64 *totalUsed, quint64 *totalFree)
136 {
137 MEMORYSTATUSEX memStatus;
138 memStatus.dwLength = sizeof(memStatus);
139 if ( GlobalMemoryStatusEx(&memStatus) ) {
140 *totalSize = memStatus.ullTotalPhys / QMC2_1M;
141 *totalFree = memStatus.ullAvailPhys / QMC2_1M;
142 *totalUsed = *totalSize - *totalFree;
143 }
144 }
145
146 #endif
147