]> gitweb.ps.run Git - autorec/blob - src/main.cpp
805932d9ff32054122de192e9a904850b0d3b7ed
[autorec] / src / main.cpp
1 #ifndef WIN32\r
2   #define WIN32\r
3 #endif\r
4 #include <WinSock2.h>\r
5 #include "win.h"\r
6 #include "ws.h"\r
7 \r
8 #define LAY_IMPLEMENTATION\r
9 #include "layout.h"\r
10 \r
11 #include <Psapi.h>\r
12 #include <stdbool.h>\r
13 #include <stdio.h>\r
14 #include <string.h>\r
15 #include <windows.h>\r
16 #include <shlwapi.h>\r
17 \r
18 void\r
19 startRecording()\r
20 {\r
21   ws::sendRequest("StartRecord");\r
22 }\r
23 \r
24 void\r
25 stopRecording()\r
26 {\r
27   ws::sendRequest("StopRecord");\r
28 }\r
29 \r
30 bool\r
31 checkProcessRunning(HANDLE handle)\r
32 {\r
33   DWORD exit_code;\r
34 \r
35   if (handle != NULL && GetExitCodeProcess(handle, &exit_code)) {\r
36     return exit_code == STILL_ACTIVE;\r
37   }\r
38 \r
39   return false;\r
40 }\r
41 \r
42 HANDLE\r
43 getHwndProcess(HWND hwnd)\r
44 {\r
45   DWORD processId, threadId = GetWindowThreadProcessId(hwnd, &processId);\r
46   return OpenProcess(PROCESS_QUERY_INFORMATION, false, processId);\r
47 }\r
48 \r
49 // HWND getProcessHwnd(HANDLE handle) {}\r
50 \r
51 bool\r
52 checkFullscreenWindow()\r
53 {\r
54   HWND desktopHwnd = GetDesktopWindow();\r
55   HWND fgHwnd = GetForegroundWindow();\r
56 \r
57   if (fgHwnd != desktopHwnd && fgHwnd != GetShellWindow()) {\r
58     RECT windowRect, desktopRect;\r
59     // Get Window and Desktop size\r
60     GetWindowRect(fgHwnd, &windowRect);\r
61     GetWindowRect(desktopHwnd, &desktopRect);\r
62 \r
63     bool fullscreen = windowRect.bottom == desktopRect.bottom &&\r
64                       windowRect.top == desktopRect.top &&\r
65                       windowRect.left == desktopRect.left &&\r
66                       windowRect.right == desktopRect.right;\r
67 \r
68     return fullscreen;\r
69   }\r
70 \r
71   return false;\r
72 }\r
73 \r
74 bool\r
75 checkForegroundProcess(std::string exeName)\r
76 {\r
77   HWND fgHwnd = GetForegroundWindow();\r
78   HANDLE fgHandle = getHwndProcess(fgHwnd);\r
79 \r
80   char filename[1024];\r
81   int len = GetModuleFileNameExA(fgHandle, NULL, filename, 1024);\r
82   PathStripPathA(filename);\r
83 \r
84   return strcmp(filename, exeName.c_str()) == 0;\r
85 }\r
86 \r
87 bool recording = false;\r
88 HANDLE process = NULL;\r
89 \r
90 // int WINAPI\r
91 // WinMain(HINSTANCE hInstance,\r
92 //         HINSTANCE hPrevInstance,\r
93 //         LPSTR lpCmdLine,\r
94 //         int nCmdShow)\r
95 int main(int argc, char **argv)\r
96 {\r
97 \r
98   //win::Window window("Title", "MyWindowClass", hInstance);\r
99   win::Window window("Title", "MyWindowClass", GetModuleHandle(0));\r
100 \r
101   lay_context *ctx = &window.ctx;\r
102   lay_id root = window.lId;\r
103 \r
104   win::Hwnd row1(&window, &window, 0, 0, 0, 25, LAY_ROW, LAY_LEFT);\r
105   lay_set_margins_ltrb(ctx, row1.lId, 5, 5, 5, 5);\r
106   win::Hwnd row2(&window, &window, 0, 0, 0, 0, LAY_ROW, LAY_FILL);\r
107   lay_set_margins_ltrb(ctx, row2.lId, 5, 5, 5, 5);\r
108 \r
109   win::CheckBox cbWindowTitle(&window, &row1, "Window Title", 100, 25, 0, 0);\r
110   win::CheckBox cbFullscreenWindow(&window, &row1, "Any Fullscreen Application", 200, 25, 0, 0);\r
111 \r
112   win::Button btnConnect(&window, &row1, "Connect", 100, 25, 0, 0);\r
113   btnConnect.onClick([&]() {\r
114     ws::connect("ws://127.0.0.1:4444");\r
115   });\r
116 \r
117   win::ListBox lstActiveProcesses(&window, &row2, 0, 0, 0, LAY_FILL);\r
118   \r
119   win::Hwnd col1(&window, &row2, 0, 0, 80, 0, LAY_COLUMN, LAY_VCENTER);\r
120   lay_set_margins_ltrb(ctx, col1.lId, 5, 0, 5, 0);\r
121 \r
122   win::ListBox lstMonitoredProcesses(&window, &row2, 0, 0, 0, LAY_FILL);\r
123   lstActiveProcesses.addStyle(WS_VSCROLL);\r
124   lstMonitoredProcesses.addStyle(WS_VSCROLL);\r
125 \r
126   win::Button btnUpdateWindows(&window, &col1, "Update", 85, 25, 0, 0);\r
127   win::Button btnStartMonitoringName(&window, &col1, "Exe name >>", 85, 25, 0, 0);\r
128   win::Button btnStartMonitoringPath(&window, &col1, "Full path >>", 85, 25, 0, 0);\r
129   win::Button btnStopMonitoring(&window, &col1, "Remove", 85, 25, 0, 0);\r
130   btnUpdateWindows.onClick([&]() {\r
131     lstActiveProcesses.clear();\r
132     for (HWND hwnd = GetTopWindow(NULL); hwnd != nullptr;\r
133          hwnd = GetNextWindow(hwnd, GW_HWNDNEXT)) {\r
134       if (!IsWindowVisible(hwnd))\r
135         continue;\r
136 \r
137       RECT rect;\r
138       GetWindowRect(hwnd, &rect);\r
139 \r
140       char str[1024];\r
141       if (GetModuleFileNameExA(getHwndProcess(hwnd), 0, str, 1024) != 0 &&\r
142           lstActiveProcesses.findString(str) == LB_ERR) {\r
143         lstActiveProcesses.addString(str);\r
144       }\r
145     }\r
146   });\r
147   btnStartMonitoringName.onClick([&]() {\r
148     int sel = lstActiveProcesses.getSelectedIndex();\r
149     if (sel < 0) return;\r
150 \r
151     std::string selStr = lstActiveProcesses.getText(sel);\r
152     \r
153     char *filename = new char[selStr.size()];\r
154     std::memcpy(filename, selStr.c_str(), selStr.size());\r
155     PathStripPathA(filename);\r
156 \r
157     if (lstMonitoredProcesses.findString(std::string(filename)) == LB_ERR)\r
158       lstMonitoredProcesses.addString(std::string(filename));\r
159 \r
160     delete[] filename;\r
161   });\r
162   btnStartMonitoringPath.onClick([&]() {\r
163     int sel = lstActiveProcesses.getSelectedIndex();\r
164     if (sel < 0) return;\r
165     std::string selStr = lstActiveProcesses.getText(sel);\r
166     if (lstMonitoredProcesses.findString(selStr) == LB_ERR)\r
167     lstMonitoredProcesses.addString(selStr);\r
168   });\r
169   btnStopMonitoring.onClick([&]() {\r
170     int sel = lstMonitoredProcesses.getSelectedIndex();\r
171     if (sel < 0) return;\r
172     lstMonitoredProcesses.remove(sel);\r
173   });\r
174 \r
175   window.show();\r
176 \r
177   ws::init();\r
178 \r
179   SetTimer(window.hwnd, 10123, 100, [](HWND, UINT, UINT_PTR, DWORD) {\r
180     if (!recording) {\r
181       if (checkForegroundProcess("League of Legends.exe")) {\r
182         recording = true;\r
183         process = getHwndProcess(GetForegroundWindow());\r
184         startRecording();\r
185       }\r
186     } else {\r
187       if (!checkProcessRunning(process)) {\r
188         recording = false;\r
189         process = NULL;\r
190         stopRecording();\r
191       }\r
192     }\r
193   });\r
194 \r
195   while (window.update()) {\r
196     ws::update();\r
197   }\r
198 }\r