一款显示网速、系统利用的软件
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Function.cpp 43KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421
  1. #include "Function.h"
  2. ////////////////////////////////////////////////////动态运行函数
  3. HRESULT pSHLoadIndirectString(LPCWSTR pszSource, LPWSTR pszOutBuf, UINT cchOutBuf, void** ppvReserved)
  4. {
  5. HRESULT ret = NULL;
  6. typedef UINT(WINAPI* pfnSHLoadIndirectString)(LPCWSTR pszSource, LPWSTR pszOutBuf, UINT cchOutBuf, void** ppvReserved);
  7. HMODULE hShell32 = LoadLibrary(L"Shlwapi.dll");
  8. if (hShell32)
  9. {
  10. pfnSHLoadIndirectString pSHLoadIndirectStringW = (pfnSHLoadIndirectString)GetProcAddress(hShell32, "SHLoadIndirectString");
  11. if (pSHLoadIndirectStringW)
  12. {
  13. ret = pSHLoadIndirectStringW(pszSource, pszOutBuf, cchOutBuf, ppvReserved);
  14. }
  15. FreeLibrary(hShell32);
  16. }
  17. return ret;
  18. }
  19. UINT pDragQueryFile(HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch)
  20. {
  21. UINT ret = NULL;
  22. typedef UINT(WINAPI* pfnDragQueryFile)(HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch);
  23. HMODULE hShell32 = LoadLibrary(L"shell32.dll");
  24. if (hShell32)
  25. {
  26. pfnDragQueryFile pDragQueryFileW = (pfnDragQueryFile)GetProcAddress(hShell32, "DragQueryFileW");
  27. if (pDragQueryFileW)
  28. {
  29. ret = pDragQueryFileW(hDrop, iFile, lpszFile, cch);
  30. }
  31. FreeLibrary(hShell32);
  32. }
  33. return ret;
  34. }
  35. HICON pExtractIcon(HINSTANCE hInst, LPCTSTR lpszExeFileName, UINT nIconIndex)
  36. {
  37. //IExtractIcon
  38. HICON ret = NULL;
  39. typedef HICON(WINAPI* pfnExtractIcon)(HINSTANCE hInst, LPCTSTR lpszExeFileName, UINT nIconIndex);
  40. HMODULE hShell32 = LoadLibrary(L"shell32.dll");
  41. if (hShell32)
  42. {
  43. pfnExtractIcon pExtractIconW = (pfnExtractIcon)GetProcAddress(hShell32, "ExtractIconW");
  44. if (pExtractIconW)
  45. {
  46. ret = pExtractIconW(hInst, lpszExeFileName, nIconIndex);
  47. }
  48. FreeLibrary(hShell32);
  49. }
  50. return ret;
  51. }
  52. DWORD pSHGetFileInfo(LPCTSTR pszPath, DWORD dwFileAttributes, SHFILEINFO FAR* psfi, UINT cbFileInfo, UINT uFlags)
  53. {
  54. //IExtractIcon
  55. DWORD ret = NULL;
  56. typedef DWORD(WINAPI* pfnSHGetFileInfo)(LPCTSTR pszPath, DWORD dwFileAttributes, SHFILEINFO FAR* psfi, UINT cbFileInfo, UINT uFlags);
  57. HMODULE hShell32 = LoadLibrary(L"shell32.dll");
  58. if (hShell32)
  59. {
  60. pfnSHGetFileInfo pSHGetFileInfoW = (pfnSHGetFileInfo)GetProcAddress(hShell32, "SHGetFileInfoW");
  61. if (pSHGetFileInfoW)
  62. {
  63. ret = pSHGetFileInfoW(pszPath, dwFileAttributes, psfi, cbFileInfo, uFlags);
  64. }
  65. FreeLibrary(hShell32);
  66. }
  67. return ret;
  68. }
  69. HRESULT pSHDefExtractIcon(LPCWSTR pszIconFile,int iIndex,UINT uFlags,HICON* phiconLarge,HICON* phiconSmall,UINT nIconSize)
  70. {
  71. //IExtractIcon
  72. HRESULT ret = NULL;
  73. typedef HRESULT(WINAPI* pfnSHDefExtractIcon)(LPCWSTR pszIconFile, int iIndex, UINT uFlags, HICON* phiconLarge, HICON* phiconSmall, UINT nIconSize);
  74. HMODULE hShell32 = LoadLibrary(L"shell32.dll");
  75. if (hShell32)
  76. {
  77. pfnSHDefExtractIcon SHDefExtractIconW = (pfnSHDefExtractIcon)GetProcAddress(hShell32, "SHDefExtractIconW");
  78. if (SHDefExtractIconW)
  79. {
  80. ret = SHDefExtractIconW(pszIconFile, iIndex, uFlags, phiconLarge, phiconSmall, nIconSize);
  81. }
  82. FreeLibrary(hShell32);
  83. }
  84. return ret;
  85. }
  86. HINSTANCE pShellExecute(_In_opt_ HWND hwnd, _In_opt_ LPCWSTR lpOperation, _In_ LPCWSTR lpFile, _In_opt_ LPCWSTR lpParameters, _In_opt_ LPCWSTR lpDirectory, _In_ INT nShowCmd)
  87. {
  88. HINSTANCE hInstance = NULL;
  89. typedef HINSTANCE(WINAPI* pfnShellExecute)(_In_opt_ HWND hwnd, _In_opt_ LPCWSTR lpOperation, _In_ LPCWSTR lpFile, _In_opt_ LPCWSTR lpParameters, _In_opt_ LPCWSTR lpDirectory, _In_ INT nShowCmd);
  90. HMODULE hShell32 = LoadLibrary(L"shell32.dll");
  91. if (hShell32)
  92. {
  93. pfnShellExecute pShellExecuteW = (pfnShellExecute)GetProcAddress(hShell32, "ShellExecuteW");
  94. if (pShellExecuteW)
  95. hInstance = pShellExecuteW(hwnd, lpOperation, lpFile, lpParameters, lpDirectory, nShowCmd);
  96. FreeLibrary(hShell32);
  97. }
  98. return hInstance;
  99. }
  100. BOOL pShell_NotifyIcon(DWORD dwMessage, _In_ PNOTIFYICONDATAW lpData)
  101. {
  102. typedef BOOL(WINAPI* pfnShell_NotifyIcon)(DWORD dwMessage, _In_ PNOTIFYICONDATAW lpData);
  103. HMODULE hShell32 = LoadLibrary(L"shell32.dll");
  104. BOOL ret = FALSE;
  105. if (hShell32)
  106. {
  107. pfnShell_NotifyIcon pShell_NotifyIconW = (pfnShell_NotifyIcon)GetProcAddress(hShell32, "Shell_NotifyIconW");
  108. if (pShell_NotifyIconW)
  109. ret = pShell_NotifyIconW(dwMessage, lpData);
  110. FreeLibrary(hShell32);
  111. }
  112. return ret;
  113. }
  114. BOOL pWTSQueryUserToken(ULONG SessionId, PHANDLE phToken)
  115. {
  116. BOOL ret = FALSE;
  117. typedef BOOL(WINAPI* pfnWTSQueryUserToken)(ULONG SessionId, PHANDLE phToken);
  118. HMODULE hWTSAPI32 = LoadLibrary(L"wtsapi32.dll");
  119. if (hWTSAPI32)
  120. {
  121. pfnWTSQueryUserToken WTSQueryUserToken = (pfnWTSQueryUserToken)GetProcAddress(hWTSAPI32, "WTSQueryUserToken");
  122. if (WTSQueryUserToken)
  123. ret = WTSQueryUserToken(SessionId, phToken);
  124. FreeLibrary(hWTSAPI32);
  125. }
  126. return ret;
  127. }
  128. BOOL pCreateEnvironmentBlock(_At_((PZZWSTR*)lpEnvironment, _Outptr_)LPVOID* lpEnvironment, _In_opt_ HANDLE hToken, _In_ BOOL bInherit)
  129. {
  130. BOOL ret = FALSE;
  131. typedef BOOL(WINAPI* pfnCreateEnvironmentBlock)(_At_((PZZWSTR*)lpEnvironment, _Outptr_)LPVOID* lpEnvironment, _In_opt_ HANDLE hToken, _In_ BOOL bInherit);
  132. HMODULE hUserenv = LoadLibrary(L"userenv.dll");
  133. if (hUserenv)
  134. {
  135. pfnCreateEnvironmentBlock CreateEnvironmentBlock = (pfnCreateEnvironmentBlock)GetProcAddress(hUserenv, "CreateEnvironmentBlock");
  136. if (CreateEnvironmentBlock)
  137. ret = CreateEnvironmentBlock(lpEnvironment, hToken, bInherit);
  138. FreeLibrary(hUserenv);
  139. }
  140. return ret;
  141. }
  142. ULONG pCallNtPowerInformation(_In_ POWER_INFORMATION_LEVEL InformationLevel, _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer, _In_ ULONG InputBufferLength, _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer, _In_ ULONG OutputBufferLength)
  143. {
  144. ULONG ret = -1;
  145. typedef BOOL(WINAPI* pfnCallNtPowerInformation)(_In_ POWER_INFORMATION_LEVEL InformationLevel, _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer, _In_ ULONG InputBufferLength, _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer, _In_ ULONG OutputBufferLength);
  146. HMODULE hPowrptof = LoadLibrary(L"powrprof.dll");
  147. if (hPowrptof)
  148. {
  149. pfnCallNtPowerInformation CallNtPowerInformation = (pfnCallNtPowerInformation)GetProcAddress(hPowrptof, "CallNtPowerInformation");
  150. if (CallNtPowerInformation)
  151. ret = CallNtPowerInformation(InformationLevel, InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength);
  152. FreeLibrary(hPowrptof);
  153. }
  154. return ret;
  155. }
  156. BOOL LaunchAppIntoDifferentSession(WCHAR* szExe, WCHAR* szDir, WCHAR* szLine)//以SYSTEM运行程序并可以交互窗口
  157. {
  158. PROCESS_INFORMATION pi;
  159. STARTUPINFO si;
  160. BOOL bResult = FALSE;
  161. DWORD winlogonPid;
  162. ULONG dwSessionId;
  163. HANDLE hUserToken, hUserTokenDup = NULL, hPToken = NULL, hProcess;
  164. DWORD dwCreationFlags;
  165. // Log the client on to the local computer.
  166. dwSessionId = WTSGetActiveConsoleSessionId();
  167. //////////////////////////////////////////
  168. // Find the winlogon process
  169. ////////////////////////////////////////
  170. PROCESSENTRY32 procEntry;
  171. HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  172. if (hSnap == INVALID_HANDLE_VALUE)
  173. {
  174. return FALSE;
  175. }
  176. procEntry.dwSize = sizeof(PROCESSENTRY32);
  177. if (!Process32First(hSnap, &procEntry))
  178. {
  179. return FALSE;
  180. }
  181. do
  182. {
  183. if (lstrcmpi(procEntry.szExeFile, L"winlogon.exe") == 0)
  184. {
  185. // We found a winlogon process...
  186. // make sure it's running in the console session
  187. DWORD winlogonSessId = 0;
  188. if (ProcessIdToSessionId(procEntry.th32ProcessID, &winlogonSessId)
  189. && winlogonSessId == dwSessionId)
  190. {
  191. winlogonPid = procEntry.th32ProcessID;
  192. break;
  193. }
  194. }
  195. } while (Process32Next(hSnap, &procEntry));
  196. ////////////////////////////////////////////////////////////////////////
  197. pWTSQueryUserToken(dwSessionId, &hUserToken);
  198. dwCreationFlags = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;
  199. memset(&si, 0, sizeof(STARTUPINFO));
  200. si.cb = sizeof(STARTUPINFO);
  201. si.lpDesktop = (LPWSTR)L"winsta0\\default";
  202. memset(&pi, 0, sizeof(pi));
  203. TOKEN_PRIVILEGES tp;
  204. LUID luid;
  205. hProcess = OpenProcess(MAXIMUM_ALLOWED, FALSE, winlogonPid);
  206. if (hProcess)
  207. {
  208. if (!::OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY
  209. | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | TOKEN_ADJUST_SESSIONID
  210. | TOKEN_READ | TOKEN_WRITE, &hPToken))
  211. {
  212. // int abcd = GetLastError();
  213. // printf("Process token open Error: %u\n", GetLastError());
  214. }
  215. if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
  216. {
  217. // printf("Lookup Privilege value Error: %u\n", GetLastError());
  218. }
  219. tp.PrivilegeCount = 1;
  220. tp.Privileges[0].Luid = luid;
  221. tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  222. DuplicateTokenEx(hPToken, MAXIMUM_ALLOWED, NULL,
  223. SecurityIdentification, TokenPrimary, &hUserTokenDup);
  224. int dup = GetLastError();
  225. //Adjust Token privilege
  226. SetTokenInformation(hUserTokenDup,
  227. TokenSessionId, (LPVOID)dwSessionId, sizeof(ULONG));
  228. if (!AdjustTokenPrivileges(hUserTokenDup, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),
  229. (PTOKEN_PRIVILEGES)NULL, NULL))
  230. {
  231. // int abc = GetLastError();
  232. // printf("Adjust Privilege value Error: %u\n", GetLastError());
  233. }
  234. if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
  235. {
  236. // printf("Token does not have the provilege\n");
  237. }
  238. LPVOID pEnv = NULL;
  239. if (pCreateEnvironmentBlock(&pEnv, hUserTokenDup, TRUE))
  240. {
  241. dwCreationFlags |= CREATE_UNICODE_ENVIRONMENT;
  242. }
  243. else
  244. pEnv = NULL;
  245. // Launch the process in the client's logon session.
  246. bResult = CreateProcessAsUser(
  247. hUserTokenDup, // client's access token
  248. szExe, // file to execute
  249. szLine, // command line
  250. NULL, // pointer to process SECURITY_ATTRIBUTES
  251. NULL, // pointer to thread SECURITY_ATTRIBUTES
  252. FALSE, // handles are not inheritable
  253. dwCreationFlags, // creation flags
  254. pEnv, // pointer to new environment block
  255. szDir, // name of current directory
  256. &si, // pointer to STARTUPINFO structure
  257. &pi // receives information about new process
  258. );
  259. }
  260. if (hProcess)
  261. {
  262. CloseHandle(hProcess);
  263. CloseHandle(hUserToken);
  264. CloseHandle(hUserTokenDup);
  265. CloseHandle(hPToken);
  266. }
  267. return bResult;
  268. }
  269. //////////////////////////////////////////////////////////////////////////服务函数
  270. BOOL bInstallService;
  271. SERVICE_STATUS_HANDLE hServiceStatus;
  272. SERVICE_STATUS status;
  273. HANDLE hEvent = INVALID_HANDLE_VALUE;
  274. void InitService()//初始化服务参数
  275. {
  276. hServiceStatus = NULL;
  277. status.dwServiceType = SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS;
  278. status.dwCurrentState = SERVICE_STOPPED;
  279. status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
  280. status.dwWin32ExitCode = 0;
  281. status.dwServiceSpecificExitCode = 0;
  282. status.dwCheckPoint = 0;
  283. status.dwWaitHint = 0;
  284. }
  285. void WINAPI ServiceStrl(DWORD dwOpcode)//服务控制函数
  286. {
  287. switch (dwOpcode)
  288. {
  289. case SERVICE_CONTROL_STOP:
  290. status.dwCurrentState = SERVICE_STOP_PENDING;
  291. SetServiceStatus(hServiceStatus, &status);
  292. //告诉服务线程停止工作
  293. ::SetEvent(hEvent);
  294. break;
  295. case SERVICE_CONTROL_PAUSE:
  296. break;
  297. case SERVICE_CONTROL_CONTINUE:
  298. break;
  299. case SERVICE_CONTROL_INTERROGATE:
  300. break;
  301. case SERVICE_CONTROL_SHUTDOWN:
  302. break;
  303. default:
  304. break;
  305. }
  306. }
  307. void WINAPI ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv)//服务主线程入口
  308. {
  309. // Register the control request handler
  310. status.dwCurrentState = SERVICE_START_PENDING;
  311. status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
  312. //注册服务控制
  313. hServiceStatus = RegisterServiceCtrlHandler(lpServiceName, ServiceStrl);
  314. if (hServiceStatus == NULL)
  315. {
  316. return;
  317. }
  318. SetServiceStatus(hServiceStatus, &status);
  319. //如下代码可以为启动服务前的准备工作
  320. hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
  321. if (hEvent == NULL)
  322. {
  323. status.dwCurrentState = SERVICE_STOPPED;
  324. SetServiceStatus(hServiceStatus, &status);
  325. return;
  326. }
  327. //更改服务状态为启动
  328. status.dwWin32ExitCode = S_OK;
  329. status.dwCheckPoint = 0;
  330. status.dwWaitHint = 0;
  331. status.dwCurrentState = SERVICE_RUNNING;
  332. SetServiceStatus(hServiceStatus, &status);
  333. //等待用户选择停止服务,
  334. //当然你也可以把你的服务代码用线程来执行,
  335. //此时这里只需等待线程结束既可。
  336. // CloseHandle(CreateFile(L"d:\\topc.txt", GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_ALWAYS, NULL, NULL));
  337. WCHAR szExe[MAX_PATH];
  338. HINSTANCE hInst = GetModuleHandle(NULL);
  339. GetModuleFileName(hInst, szExe, MAX_PATH);
  340. size_t iLen = wcslen(szExe);
  341. szExe[iLen] = L'\0';
  342. WCHAR szLine[] = L" t";
  343. // CreateProcessByExplorer(szExe, NULL, NULL);
  344. LaunchAppIntoDifferentSession(szExe, NULL, szLine);
  345. while (WaitForSingleObject(hEvent, 1000) != WAIT_OBJECT_0)
  346. {
  347. }
  348. //停止服务
  349. status.dwCurrentState = SERVICE_STOPPED;
  350. SetServiceStatus(hServiceStatus, &status);
  351. }
  352. DWORD ServiceRunState()//服务运行状态
  353. {
  354. BOOL bResult = FALSE;
  355. //打开服务控制管理器
  356. SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  357. if (hSCM != NULL)
  358. {
  359. //打开服务
  360. SC_HANDLE hService = ::OpenService(hSCM, lpServiceName, SERVICE_QUERY_STATUS);
  361. if (hService != NULL)
  362. {
  363. SERVICE_STATUS ss;
  364. QueryServiceStatus(hService, &ss);
  365. bResult = ss.dwCurrentState;
  366. ::CloseServiceHandle(hService);
  367. }
  368. ::CloseServiceHandle(hSCM);
  369. }
  370. return bResult;
  371. }
  372. BOOL IsServiceInstalled()//服务是否已经安装
  373. {
  374. BOOL bResult = FALSE;
  375. //打开服务控制管理器
  376. SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  377. if (hSCM != NULL)
  378. {
  379. //打开服务
  380. SC_HANDLE hService = ::OpenService(hSCM, lpServiceName, SERVICE_QUERY_CONFIG);
  381. if (hService != NULL)
  382. {
  383. bResult = TRUE;
  384. ::CloseServiceHandle(hService);
  385. }
  386. ::CloseServiceHandle(hSCM);
  387. }
  388. return bResult;
  389. }
  390. BOOL InstallService()//安装服务
  391. {
  392. if (IsServiceInstalled())
  393. return TRUE;
  394. //打开服务控制管理器
  395. SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  396. if (hSCM == NULL)
  397. {
  398. return FALSE;
  399. }
  400. // Get the executable file path
  401. TCHAR szFilePath[MAX_PATH];
  402. ::GetModuleFileName(NULL, szFilePath, MAX_PATH);
  403. //创建服务
  404. SC_HANDLE hService = ::CreateService(
  405. hSCM,
  406. lpServiceName,
  407. lpServiceName,
  408. SERVICE_ALL_ACCESS,
  409. SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,
  410. SERVICE_AUTO_START, //如果为SERVICE_DEMAND_START则表示此服务需手工启动
  411. SERVICE_ERROR_NORMAL,
  412. szFilePath,
  413. NULL,
  414. NULL,
  415. L"",
  416. NULL,
  417. NULL);
  418. if (hService == NULL)
  419. {
  420. ::CloseServiceHandle(hSCM);
  421. return FALSE;
  422. }
  423. ::CloseServiceHandle(hService);
  424. ::CloseServiceHandle(hSCM);
  425. return TRUE;
  426. }
  427. BOOL UninstallService()//卸载服务
  428. {
  429. if (!IsServiceInstalled())
  430. return TRUE;
  431. SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  432. if (hSCM == NULL)
  433. {
  434. return FALSE;
  435. }
  436. SC_HANDLE hService = ::OpenService(hSCM, lpServiceName, SERVICE_STOP | DELETE);
  437. if (hService == NULL)
  438. {
  439. ::CloseServiceHandle(hSCM);
  440. return FALSE;
  441. }
  442. SERVICE_STATUS status;
  443. ::ControlService(hService, SERVICE_CONTROL_STOP, &status);
  444. //删除服务
  445. BOOL bDelete = ::DeleteService(hService);
  446. ::CloseServiceHandle(hService);
  447. ::CloseServiceHandle(hSCM);
  448. if (bDelete)
  449. return TRUE;
  450. return FALSE;
  451. }
  452. BOOL ServiceCtrlStart()//开启服务
  453. {
  454. BOOL bRet;
  455. SC_HANDLE hSCM;
  456. SC_HANDLE hService;
  457. hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
  458. if (hSCM != NULL)
  459. {
  460. // hService = OpenService(hSCM, szServiceName, SERVICE_START);
  461. hService = OpenService(hSCM, lpServiceName, SERVICE_ALL_ACCESS);
  462. if (hService != NULL)
  463. {
  464. TCHAR szFilePath[MAX_PATH];
  465. ::GetModuleFileName(NULL, szFilePath, MAX_PATH);
  466. ChangeServiceConfig(hService, SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START, SERVICE_NO_CHANGE, szFilePath, NULL, NULL, NULL, NULL, NULL, NULL);
  467. //开始Service
  468. bRet = StartService(hService, 0, NULL);
  469. CloseServiceHandle(hService);
  470. }
  471. else
  472. {
  473. bRet = FALSE;
  474. }
  475. CloseServiceHandle(hSCM);
  476. }
  477. else
  478. {
  479. bRet = FALSE;
  480. }
  481. return bRet;
  482. }
  483. BOOL ServiceCtrlStop()//停止服务
  484. {
  485. BOOL bRet;
  486. SC_HANDLE hSCM;
  487. SC_HANDLE hService;
  488. SERVICE_STATUS ServiceStatus;
  489. hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  490. if (hSCM != NULL)
  491. {
  492. hService = OpenService(hSCM, lpServiceName, SERVICE_STOP | SERVICE_QUERY_STATUS);
  493. if (hService != NULL)
  494. {
  495. QueryServiceStatus(hService, &ServiceStatus);
  496. if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
  497. {
  498. bRet = ControlService(hService, SERVICE_CONTROL_STOP, &ServiceStatus);
  499. }
  500. else
  501. {
  502. bRet = FALSE;
  503. }
  504. CloseServiceHandle(hService);
  505. }
  506. else
  507. {
  508. bRet = FALSE;
  509. }
  510. CloseServiceHandle(hSCM);
  511. }
  512. else
  513. {
  514. bRet = FALSE;
  515. }
  516. return bRet;
  517. }
  518. int GetScreenRect(HWND hWnd, LPRECT lpRect, BOOL bTray)//获取窗口所在的屏幕大小可减去任务栏
  519. {
  520. HMONITOR hMon = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);
  521. MONITORINFO mi;
  522. mi.cbSize = sizeof mi;
  523. GetMonitorInfo(hMon, &mi);
  524. if (bTray)
  525. {
  526. RECT TrayRect;
  527. if (mi.rcMonitor.left == 0 && mi.rcMonitor.top == 0)
  528. {
  529. HWND hTrayWnd = ::FindWindow(szShellTray, NULL);
  530. GetWindowRect(hTrayWnd, &TrayRect);
  531. }
  532. else
  533. {
  534. HWND hSecondaryTray;
  535. hSecondaryTray = FindWindow(szSecondaryTray, NULL);
  536. while (hSecondaryTray)
  537. {
  538. GetWindowRect(hSecondaryTray, &TrayRect);
  539. POINT pt;
  540. pt.x = TrayRect.left;
  541. pt.y = TrayRect.top;
  542. if (PtInRect(lpRect, pt))
  543. break;
  544. hSecondaryTray = FindWindowEx(NULL, hSecondaryTray, szSecondaryTray, NULL);
  545. }
  546. }
  547. RECT dRect;
  548. SubtractRect(&dRect, &mi.rcMonitor, &TrayRect);
  549. CopyRect(lpRect, &dRect);
  550. }
  551. else
  552. CopyRect(lpRect, &mi.rcMonitor);
  553. return 0;
  554. }
  555. typedef struct _PROCESS_BASIC_INFORMATION
  556. {
  557. PVOID Reserved1;
  558. DWORD PebBaseAddress;
  559. PVOID Reserved2[2];
  560. ULONG_PTR UniqueProcessId;
  561. ULONG InheritedFromUniqueProcessId;
  562. }PROCESS_BASIC_INFORMATION;
  563. typedef LONG(WINAPI* pfnNtQueryInformationProcess)(HANDLE, UINT, PVOID, ULONG, PULONG);
  564. DWORD GetParentProcessID(DWORD dwProcessId)//获取父进程ID
  565. {
  566. if (dwProcessId == -1)
  567. return -1;
  568. LONG status;
  569. DWORD dwParentPID = (DWORD)-1;
  570. HANDLE hProcess;
  571. PROCESS_BASIC_INFORMATION pbi;
  572. pfnNtQueryInformationProcess NtQueryInformationProcess = (pfnNtQueryInformationProcess)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQueryInformationProcess");
  573. if (NULL == NtQueryInformationProcess)
  574. return (DWORD)-1;
  575. hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcessId);
  576. if (!hProcess)
  577. {
  578. hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwProcessId);
  579. }
  580. if (!hProcess)
  581. return (DWORD)-1;
  582. status = NtQueryInformationProcess(hProcess, 0, (PVOID)&pbi, sizeof(PROCESS_BASIC_INFORMATION), NULL);
  583. if (!status)
  584. dwParentPID = pbi.InheritedFromUniqueProcessId;
  585. CloseHandle(hProcess);
  586. return dwParentPID;
  587. }
  588. BOOL GetSetVolume(BOOL bSet, HWND hWnd, DWORD dwProcessId, float* fVolume, BOOL* bMute, BOOL IsMixer)
  589. {
  590. DWORD dwCProcessId = -1;
  591. if (hWnd)
  592. GetWindowThreadProcessId(hWnd, &dwProcessId);
  593. BOOL ret = FALSE;
  594. HRESULT hr = S_OK;
  595. IMMDeviceCollection* pMultiDevice = NULL;
  596. IMMDevice* pDevice = NULL;
  597. IAudioSessionEnumerator* pSessionEnum = NULL;
  598. IAudioSessionManager2* pASManager = NULL;
  599. IMMDeviceEnumerator* m_pEnumerator = NULL;
  600. const IID IID_ISimpleAudioVolume = __uuidof(ISimpleAudioVolume);
  601. const IID IID_IAudioSessionControl2 = __uuidof(IAudioSessionControl2);
  602. GUID m_guidMyContext;
  603. CoInitialize(NULL);
  604. hr = CoCreateGuid(&m_guidMyContext);
  605. if (CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&m_pEnumerator) == S_OK)
  606. {
  607. if (IsMixer)
  608. {
  609. hr = m_pEnumerator->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &pMultiDevice);
  610. }
  611. else
  612. {
  613. hr = m_pEnumerator->EnumAudioEndpoints(eCapture, DEVICE_STATE_ACTIVE, &pMultiDevice);
  614. }
  615. if (hr == S_OK)
  616. {
  617. UINT deviceCount = 0;
  618. if (pMultiDevice->GetCount(&deviceCount) == S_OK)
  619. {
  620. for (UINT ii = 0; ii < deviceCount; ii++)
  621. {
  622. pDevice = NULL;
  623. if (pMultiDevice->Item(ii, &pDevice) == S_OK)
  624. {
  625. if (pDevice->Activate(__uuidof(IAudioSessionManager), CLSCTX_ALL, NULL, (void**)&pASManager) == S_OK)
  626. {
  627. if (pASManager->GetSessionEnumerator(&pSessionEnum) == S_OK)
  628. {
  629. int nCount;
  630. if (pSessionEnum->GetCount(&nCount) == S_OK)
  631. {
  632. for (int i = 0; i < nCount; i++)
  633. {
  634. IAudioSessionControl* pSessionCtrl;
  635. if (pSessionEnum->GetSession(i, &pSessionCtrl) == S_OK)
  636. {
  637. IAudioSessionControl2* pSessionCtrl2;
  638. if (pSessionCtrl->QueryInterface(IID_IAudioSessionControl2, (void**)&pSessionCtrl2) == S_OK)
  639. {
  640. ULONG pid;
  641. if (pSessionCtrl2->GetProcessId(&pid) == S_OK)
  642. {
  643. ISimpleAudioVolume* pSimplevol;
  644. if (pSessionCtrl2->QueryInterface(IID_ISimpleAudioVolume, (void**)&pSimplevol) == S_OK)
  645. {
  646. if (pid == dwProcessId || dwProcessId == GetParentProcessID(pid))
  647. {
  648. if (bSet)
  649. {
  650. if (fVolume)
  651. pSimplevol->SetMasterVolume(*fVolume, NULL);
  652. if (bMute)
  653. pSimplevol->SetMute(*bMute, NULL);
  654. }
  655. else
  656. {
  657. if (fVolume)
  658. {
  659. pSimplevol->GetMasterVolume(fVolume);
  660. }
  661. if (bMute)
  662. {
  663. pSimplevol->GetMute(bMute);
  664. }
  665. }
  666. ret = TRUE;
  667. }
  668. pSimplevol->Release();
  669. }
  670. }
  671. pSessionCtrl2->Release();
  672. }
  673. pSessionCtrl->Release();
  674. }
  675. }
  676. }
  677. pSessionEnum->Release();
  678. }
  679. pASManager->Release();
  680. }
  681. pDevice->Release();
  682. }
  683. }
  684. }
  685. pMultiDevice->Release();
  686. }
  687. m_pEnumerator->Release();
  688. }
  689. CoUninitialize();
  690. return ret;
  691. }
  692. BOOL EnableDebugPrivilege(BOOL bEnableDebugPrivilege)//DEBUG提权
  693. {
  694. HANDLE hToken;
  695. TOKEN_PRIVILEGES tp;
  696. if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  697. {
  698. if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid))
  699. {
  700. tp.PrivilegeCount = 1;
  701. if (bEnableDebugPrivilege)
  702. tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  703. else
  704. tp.Privileges[0].Attributes = 0;
  705. if (AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL))
  706. {
  707. ::CloseHandle(hToken);
  708. return TRUE;
  709. }
  710. }
  711. CloseHandle(hToken);
  712. }
  713. return FALSE;
  714. }
  715. BOOL IsUserAdmin()//判断是以管理员权限运行
  716. {
  717. // IsUserAnAdmin();
  718. BOOL b;
  719. SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
  720. PSID AdministratorsGroup;
  721. b = AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &AdministratorsGroup);
  722. if (b)
  723. {
  724. if (!CheckTokenMembership(NULL, AdministratorsGroup, &b))
  725. {
  726. b = FALSE;
  727. }
  728. FreeSid(AdministratorsGroup);
  729. }
  730. return(b);
  731. }
  732. void SetToCurrentPath()
  733. {
  734. WCHAR szDir[MAX_PATH];
  735. GetModuleFileName(NULL, szDir, MAX_PATH);
  736. int len = lstrlen(szDir);
  737. for (int i = len - 1; i > 0; i--)
  738. {
  739. if (szDir[i] == '\\')
  740. {
  741. szDir[i] = 0;
  742. SetCurrentDirectory(szDir);
  743. break;
  744. }
  745. }
  746. }
  747. BOOL RunProcess(LPTSTR szExe, const WCHAR* szCommandLine)
  748. {
  749. BOOL ret = FALSE;
  750. STARTUPINFO StartInfo;
  751. PROCESS_INFORMATION procStruct;
  752. memset(&StartInfo, 0, sizeof(STARTUPINFO));
  753. StartInfo.cb = sizeof(STARTUPINFO);
  754. WCHAR* sz;
  755. WCHAR szName[MAX_PATH];
  756. if (szExe == (LPTSTR)1)
  757. sz = NULL;
  758. else if (szExe)
  759. sz = szExe;
  760. else
  761. {
  762. GetModuleFileName(NULL, szName, MAX_PATH);
  763. sz = szName;
  764. }
  765. WCHAR szLine[MAX_PATH];
  766. lstrcpy(szLine, szCommandLine);
  767. ret = CreateProcess(sz,// RUN_TEST.bat位于工程所在目录下
  768. szLine,
  769. NULL,
  770. NULL,
  771. FALSE,
  772. NULL,// 这里不为该进程创建一个控制台窗口
  773. NULL,
  774. NULL,
  775. &StartInfo, &procStruct);
  776. CloseHandle(procStruct.hProcess);
  777. CloseHandle(procStruct.hThread);
  778. // SetTimer(hMain, 11, 1000, NULL);
  779. return ret;
  780. }
  781. void SetTaskScheduler(BOOL bDelAdd, const WCHAR* szName)///////////////////////////////////设置开机任务计划/删除任务计划
  782. {
  783. SetToCurrentPath();
  784. WCHAR szDelSchtasks[MAX_PATH];
  785. wsprintf(szDelSchtasks, L" s/Delete /TN %s /F", szName);
  786. RunProcess(NULL, szDelSchtasks);
  787. Sleep(300);
  788. if (bDelAdd)
  789. {
  790. const WCHAR szXML1[] = L"<\?xml version=\"1.0\" encoding=\"unicode\"\?><Task version=\"1.2\" xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\"><RegistrationInfo><URI>\\%s</URI></RegistrationInfo><Triggers><LogonTrigger><Enabled>true</Enabled>%s</LogonTrigger></Triggers><Principals><Principal>%s</Principal></Principals><Settings><MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy><DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries><StopIfGoingOnBatteries>false</StopIfGoingOnBatteries><AllowHardTerminate>false</AllowHardTerminate><StartWhenAvailable>true</StartWhenAvailable><RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable><IdleSettings><Duration>PT10M</Duration><WaitTimeout>PT1H</WaitTimeout><StopOnIdleEnd>true</StopOnIdleEnd><RestartOnIdle>false</RestartOnIdle></IdleSettings><AllowStartOnDemand>true</AllowStartOnDemand><Enabled>true</Enabled><Hidden>false</Hidden>";
  791. const WCHAR szXML2[] = L"<RunOnlyIfIdle>false</RunOnlyIfIdle><WakeToRun>true</WakeToRun><ExecutionTimeLimit>PT0S</ExecutionTimeLimit><Priority>7</Priority></Settings><Actions Context=\"Author\"><Exec><Command>%s</Command><Arguments>t</Arguments></Exec></Actions></Task>";
  792. WCHAR sXML[4096];
  793. WCHAR szExe[MAX_PATH];
  794. GetModuleFileName(NULL, szExe, MAX_PATH);
  795. // LoadString(hInst, IDS_XML1, szXML, 2048);
  796. if (IsUserAdmin())
  797. {
  798. wsprintf(sXML, szXML1, szName, L" ", L"<RunLevel>HighestAvailable</RunLevel><GroupId>Builtin\\Administrators</GroupId>");
  799. // LoadString(hInst, IDS_XML2, szXML, 2048);
  800. int iLen = lstrlen(sXML);
  801. wsprintf(&sXML[iLen], szXML2, szExe);
  802. }
  803. else
  804. {
  805. WCHAR szUserName[64];
  806. DWORD dwLen = 64;
  807. GetUserName(szUserName, &dwLen);
  808. WCHAR szID[64];
  809. wsprintf(szID, L"<UserId>%s</UserId>", szUserName);
  810. WCHAR szUserID[128];
  811. wsprintf(szUserID, L"<UserId>%s</UserId><LogonType>InteractiveToken</LogonType>", szUserName);
  812. wsprintf(sXML, szXML1, szName, szID, szUserID);
  813. // LoadString(hInst, IDS_XML2, szXML, 2048);
  814. int iLen = lstrlen(sXML);
  815. wsprintf(&sXML[iLen], szXML2, szExe);
  816. }
  817. WCHAR szFileName[64];
  818. wsprintf(szFileName, L"%s.xml", szName);
  819. HANDLE hFile = CreateFile(szFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL);
  820. if (hFile)
  821. {
  822. DWORD dwBytes;
  823. WORD unicode_identifier = 0xfeff;
  824. WriteFile(hFile, &unicode_identifier, sizeof(WORD), &dwBytes, NULL);
  825. WriteFile(hFile, sXML, (DWORD)lstrlen(sXML) * 2, &dwBytes, NULL);
  826. CloseHandle(hFile);
  827. }
  828. WCHAR szCreateSchtasks[MAX_PATH];
  829. wsprintf(szCreateSchtasks, L" s/create /XML %s.xml /tn %s", szName, szName);
  830. // WCHAR szRunSchtasks[] = L" s/Run /TN TaryS";
  831. RunProcess(NULL, szCreateSchtasks);
  832. // RunProcess(szRunSchtasks);
  833. }
  834. }
  835. BOOL AutoRun(BOOL GetSet, BOOL bAutoRun,const WCHAR* szName)//读取、设置开机启动、关闭开机启动
  836. {
  837. // UninstallService();
  838. BOOL ret = FALSE;
  839. /*
  840. if (GetSet == FALSE)
  841. {
  842. WCHAR szExe[MAX_PATH];
  843. GetSystemDirectory(szExe, MAX_PATH);
  844. lstrcat(szExe, L"\\schtasks.exe");
  845. DWORD exitCode = 0;
  846. PROCESS_INFORMATION pInfo = { 0 };
  847. STARTUPINFO sInfo = { 0 };
  848. sInfo.cb = sizeof(STARTUPINFO);
  849. sInfo.wShowWindow = SW_HIDE;
  850. WCHAR szCommandLine[MAX_PATH];
  851. lstrcpy(szCommandLine, L"/Query /TN ");
  852. lstrcat(szCommandLine,szName);
  853. if (CreateProcess(szExe, szCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &sInfo, &pInfo))
  854. {
  855. // Wait until child process exits.
  856. WaitForSingleObject(pInfo.hProcess, INFINITE);
  857. if (GetExitCodeProcess(pInfo.hProcess, &exitCode))
  858. {
  859. CloseHandle(pInfo.hProcess);
  860. CloseHandle(pInfo.hThread);
  861. if (exitCode == 0)
  862. return TRUE;
  863. }
  864. else
  865. {
  866. CloseHandle(pInfo.hProcess);
  867. CloseHandle(pInfo.hThread);
  868. }
  869. }
  870. }
  871. */
  872. WCHAR sFileName[MAX_PATH];
  873. sFileName[0] = L'\"';
  874. GetModuleFileName(NULL, &sFileName[1], MAX_PATH);
  875. int sLen = lstrlen(sFileName);
  876. sFileName[sLen] = L'\"';
  877. sFileName[sLen + 1] = L' ';
  878. sFileName[sLen + 2] = L't';
  879. sFileName[sLen + 3] = L'\0';
  880. if (IsUserAdmin())
  881. {
  882. if (GetSet)
  883. {
  884. HKEY pKey;
  885. RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", NULL, KEY_ALL_ACCESS, &pKey);
  886. if (pKey)
  887. {
  888. RegDeleteValue(pKey, szName);
  889. RegCloseKey(pKey);
  890. }
  891. RegOpenKeyEx(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", NULL, KEY_ALL_ACCESS, &pKey);
  892. if (pKey)
  893. {
  894. RegDeleteValue(pKey, szName);
  895. RegCloseKey(pKey);
  896. }
  897. if (bAutoRun)
  898. {
  899. SetTaskScheduler(TRUE, szName);
  900. InstallService();
  901. }
  902. else
  903. {
  904. SetTaskScheduler(FALSE, szName);
  905. if (IsServiceInstalled())
  906. UninstallService();
  907. }
  908. }
  909. else
  910. {
  911. return IsServiceInstalled();
  912. }
  913. }
  914. else
  915. {
  916. HKEY pKey;
  917. RegOpenKeyEx(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", NULL, KEY_ALL_ACCESS, &pKey);
  918. if (pKey)
  919. {
  920. if (GetSet)
  921. {
  922. if (bAutoRun)
  923. {
  924. SetTaskScheduler(TRUE, szName);
  925. RegSetValueEx(pKey, szName, NULL, REG_SZ, (BYTE*)sFileName, (DWORD)lstrlen(sFileName) * 2);
  926. }
  927. else
  928. {
  929. SetTaskScheduler(FALSE, szName);
  930. RegDeleteValue(pKey, szName);
  931. }
  932. ret = TRUE;
  933. }
  934. else
  935. {
  936. WCHAR nFileName[MAX_PATH];
  937. DWORD cbData = MAX_PATH * sizeof WCHAR;
  938. DWORD dType = REG_SZ;
  939. if (RegQueryValueEx(pKey, szName, NULL, &dType, (LPBYTE)nFileName, &cbData) == ERROR_SUCCESS)
  940. {
  941. if (lstrcmp(sFileName, nFileName) == 0)
  942. ret = TRUE;
  943. else
  944. ret = FALSE;
  945. }
  946. }
  947. RegCloseKey(pKey);
  948. }
  949. }
  950. return ret;
  951. }
  952. BOOL SetWindowCompositionAttribute(HWND hWnd, ACCENT_STATE mode, DWORD AlphaColor)//设置窗口WIN10风格
  953. {
  954. pfnSetWindowCompositionAttribute pSetWindowCompositionAttribute = NULL;
  955. if (mode == ACCENT_DISABLED)
  956. {
  957. // if (bAccentNormal == FALSE)
  958. {
  959. SendMessage(hWnd, WM_THEMECHANGED, 0, 0);
  960. // bAccentNormal = TRUE;
  961. }
  962. return TRUE;
  963. }
  964. // bAccentNormal = FALSE;
  965. BOOL ret = FALSE;
  966. HMODULE hUser = GetModuleHandle(L"user32.dll");
  967. if (hUser)
  968. pSetWindowCompositionAttribute = (pfnSetWindowCompositionAttribute)GetProcAddress(hUser, "SetWindowCompositionAttribute");
  969. if (pSetWindowCompositionAttribute)
  970. {
  971. ACCENT_POLICY accent = { mode, 2, AlphaColor, 0 };
  972. _WINDOWCOMPOSITIONATTRIBDATA data;
  973. data.Attrib = WCA_ACCENT_POLICY;
  974. data.pvData = &accent;
  975. data.cbData = sizeof(accent);
  976. ret = pSetWindowCompositionAttribute(hWnd, &data);
  977. }
  978. return ret;
  979. }
  980. /*
  981. typedef BOOL(WINAPI*pfnGetWindowCompositionAttribute)(HWND, struct _WINDOWCOMPOSITIONATTRIBDATA*);
  982. BOOL GetWindowCompositionAttribute(HWND hWnd, ACCENT_POLICY * accent)
  983. {
  984. BOOL ret = FALSE;
  985. HMODULE hUser = GetModuleHandle(L"user32.dll");
  986. if (hUser)
  987. {
  988. pfnGetWindowCompositionAttribute getWindowCompositionAttribute = (pfnGetWindowCompositionAttribute)GetProcAddress(hUser, "GetWindowCompositionAttribute");
  989. if (getWindowCompositionAttribute)
  990. {
  991. _WINDOWCOMPOSITIONATTRIBDATA data;
  992. ACCENT_POLICY acc[2];
  993. data.Attrib = WCA_ACCENT_POLICY;
  994. data.pvData = acc;
  995. data.cbData = sizeof ACCENT_POLICY * 2;
  996. ret = getWindowCompositionAttribute(hWnd, &data);
  997. }
  998. }
  999. return ret;
  1000. }
  1001. */
  1002. BOOL GetProcessFileName(DWORD dwProcessId, LPTSTR pszFileName, DWORD dwFileNameLength)
  1003. {
  1004. BOOL bResult = false;
  1005. HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessId);
  1006. if (hProc == NULL)
  1007. hProc = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwProcessId);
  1008. if (hProc)
  1009. {
  1010. HMODULE hPSAPI = LoadLibrary(L"psapi.dll");
  1011. if (hPSAPI)
  1012. {
  1013. typedef DWORD(WINAPI* pfnGetModuleFileNameEx)(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize);
  1014. pfnGetModuleFileNameEx pGetModuleFileNameEx = (pfnGetModuleFileNameEx)GetProcAddress(hPSAPI, "GetModuleFileNameExW");
  1015. bResult = pGetModuleFileNameEx(hProc, NULL, pszFileName, dwFileNameLength);
  1016. if (bResult == 0)
  1017. {
  1018. typedef WINUSERAPI BOOL WINAPI QUERYFULLPROCESSIMAGENAME(HANDLE hProcess, DWORD dwFlags, LPTSTR lpExeName, PDWORD lpdwSize);
  1019. QUERYFULLPROCESSIMAGENAME* pQueryFullProcessImageName = (QUERYFULLPROCESSIMAGENAME*)GetProcAddress(GetModuleHandleA("Kernel32.dll"), "QueryFullProcessImageNameW");
  1020. if (pQueryFullProcessImageName)
  1021. {
  1022. DWORD dwSize = dwFileNameLength;
  1023. bResult = pQueryFullProcessImageName(hProc, 0, pszFileName, &dwSize);
  1024. }
  1025. }
  1026. FreeLibrary(hPSAPI);
  1027. if (bResult == FALSE)
  1028. bResult = GetProcessImageFileName(hProc, pszFileName, dwFileNameLength);
  1029. }
  1030. CloseHandle(hProc);
  1031. }
  1032. return bResult;
  1033. }
  1034. bool GetFileNameFromWindowHandle(HWND hWnd, LPTSTR lpFileName, DWORD dwFileNameLength)
  1035. {
  1036. bool bResult = false;
  1037. DWORD dwProcessId = 0;
  1038. if (GetWindowThreadProcessId(hWnd, &dwProcessId) != 0)
  1039. {
  1040. bResult = GetProcessFileName(dwProcessId, lpFileName, dwFileNameLength);
  1041. }
  1042. return bResult;
  1043. }
  1044. typedef struct PACKAGE_VERSION {
  1045. union {
  1046. UINT64 Version;
  1047. struct {
  1048. USHORT Revision;
  1049. USHORT Build;
  1050. USHORT Minor;
  1051. USHORT Major;
  1052. } DUMMYSTRUCTNAME;
  1053. } DUMMYUNIONNAME;
  1054. } PACKAGE_VERSION;
  1055. typedef struct PACKAGE_ID {
  1056. UINT32 reserved;
  1057. UINT32 processorArchitecture;
  1058. PACKAGE_VERSION version;
  1059. PWSTR name;
  1060. PWSTR publisher;
  1061. PWSTR resourceId;
  1062. PWSTR publisherId;
  1063. } PACKAGE_ID;
  1064. #define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)
  1065. #define ARRAY_SIZEOF(array) (sizeof(array)/sizeof(array[0]))
  1066. HICON GetUWPAppIcon(HWND hWnd, UINT uiIconSize = 32) {
  1067. HICON hIcon = NULL;
  1068. static LONG(WINAPI * pGetPackageFullName)(HANDLE, UINT32*, PWSTR);
  1069. static LONG(WINAPI * pGetPackagePathByFullName)(PCWSTR, UINT32*, PWSTR);
  1070. static LONG(WINAPI * pPackageIdFromFullName)(PCWSTR, const UINT32, UINT32*, BYTE*);
  1071. if (!pGetPackageFullName)pGetPackageFullName = (LONG(WINAPI*)(HANDLE, UINT32*, PWSTR))
  1072. GetProcAddress(GetModuleHandle(L"kernel32"), "GetPackageFullName");
  1073. if (!pGetPackagePathByFullName)pGetPackagePathByFullName = (LONG(WINAPI*)(PCWSTR, UINT32*, PWSTR))
  1074. GetProcAddress(GetModuleHandle(L"kernel32"), "GetPackagePathByFullName");
  1075. if (!pPackageIdFromFullName)pPackageIdFromFullName = (LONG(WINAPI*)(PCWSTR, const UINT32, UINT32*, BYTE*))
  1076. GetProcAddress(GetModuleHandle(L"kernel32"), "PackageIdFromFullName");
  1077. if (pGetPackageFullName && pGetPackagePathByFullName && pPackageIdFromFullName)
  1078. {
  1079. WCHAR szPackageName[MAX_PATH];
  1080. WCHAR szPackagePath[MAX_PATH];
  1081. szPackageName[0] = L'\0';
  1082. UINT32 uiPackageNameLength = MAX_PATH;
  1083. UINT32 uiPackagePathLength = MAX_PATH;
  1084. UINT32 uiPackageIdLength = 0;
  1085. DWORD dwProcessId = 0;
  1086. GetWindowThreadProcessId(hWnd, &dwProcessId);
  1087. HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwProcessId);
  1088. pGetPackageFullName(hProcess, &uiPackageNameLength, szPackageName);
  1089. pGetPackagePathByFullName(szPackageName, &uiPackagePathLength, szPackagePath);
  1090. pPackageIdFromFullName(szPackageName, 0, &uiPackageIdLength, NULL);
  1091. BYTE* byPackageId = (BYTE*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, uiPackageIdLength);
  1092. pPackageIdFromFullName(szPackageName, 0, &uiPackageIdLength, byPackageId);
  1093. CloseHandle(hProcess);
  1094. // if (OpenProcessDir(dwProcessId, szPackagePath))
  1095. if (byPackageId)
  1096. {
  1097. if (szPackageName[0] != 0)
  1098. {
  1099. if (szPackagePath[lstrlen(szPackagePath) - 1] != '\\')lstrcat(szPackagePath, L"\\");
  1100. lstrcat(szPackagePath, L"AppxManifest.xml");
  1101. HANDLE hFile = CreateFile(szPackagePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
  1102. if (hFile)
  1103. {
  1104. DWORD dwSize = GetFileSize(hFile, NULL);
  1105. BYTE* utf8 = (BYTE*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize);
  1106. ReadFile(hFile, utf8, dwSize, NULL, NULL);
  1107. CloseHandle(hFile);
  1108. WCHAR* szXML = (WCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize * 3);
  1109. MultiByteToWideChar(CP_UTF8, 0, (LPCCH)utf8, dwSize, szXML, dwSize * 2);
  1110. HeapFree(GetProcessHeap(), 0, utf8);
  1111. WCHAR* sz44 = lstrstr(szXML, L"Square44x44Logo");
  1112. WCHAR* szY = NULL;
  1113. if (sz44)
  1114. {
  1115. szY = lstrstr(sz44, L"\"");
  1116. if (szY)
  1117. {
  1118. WCHAR* szYY = lstrstr(&szY[1], L"\"");
  1119. if (szYY)
  1120. szYY[0] = L'\0';
  1121. }
  1122. }
  1123. TCHAR szLogoPath[MAX_PATH];
  1124. if (szY)
  1125. {
  1126. // WCHAR szName[MAX_PATH];
  1127. // WCHAR* sz_ = wcsstr(szPackageName, L"_");
  1128. // if(sz_)
  1129. // wcsncpy_s(szName, MAX_PATH, szPackageName, sz_ - szPackageName);
  1130. wsprintf(szLogoPath, L"@{%s?ms-resource://%s/Files/%s}", szPackageName, ((PACKAGE_ID*)byPackageId)->name, &szY[1]);
  1131. for (int ii = 0, length = lstrlen(szLogoPath); ii < length; ii++)
  1132. if (szLogoPath[ii] == '\\')szLogoPath[ii] = '/';
  1133. pSHLoadIndirectString(szLogoPath, szLogoPath, MAX_PATH, 0);
  1134. if (GetFileAttributes(szLogoPath) != 0xFFFFFFFF)
  1135. {
  1136. // ULONG_PTR ulToken;
  1137. // Gdiplus::GdiplusStartupInput gdiplusStartupInput;
  1138. // Gdiplus::GdiplusStartup(&ulToken, &gdiplusStartupInput, NULL);
  1139. {
  1140. Gdiplus::Bitmap bBitmapOrig(szLogoPath);
  1141. Gdiplus::Bitmap bBitmap(uiIconSize, uiIconSize);
  1142. Gdiplus::Graphics gGraphics(&bBitmap);
  1143. gGraphics.DrawImage(&bBitmapOrig, 0, 0, uiIconSize, uiIconSize);
  1144. HICON sIcon;
  1145. bBitmap.GetHICON(&sIcon);
  1146. if (sIcon)
  1147. {
  1148. hIcon = CopyIcon(sIcon);
  1149. DestroyIcon(sIcon);
  1150. }
  1151. }
  1152. // Gdiplus::GdiplusShutdown(ulToken);
  1153. }
  1154. }
  1155. HeapFree(GetProcessHeap(), 0, szXML);
  1156. }
  1157. }
  1158. HeapFree(GetProcessHeap(), 0, byPackageId);
  1159. }
  1160. }
  1161. return hIcon;
  1162. }
  1163. HICON GetIcon(HWND hWnd, BOOL* bUWP, HWND* hUICoreWnd,int IconSize)
  1164. {
  1165. HICON hIcon = NULL;
  1166. *bUWP = FALSE;
  1167. if (hUICoreWnd)
  1168. *hUICoreWnd = FALSE;
  1169. if (hWnd == NULL /*|| IsHungAppWindow(hWnd)*/)return NULL;
  1170. WCHAR szClassName[MAX_PATH];
  1171. GetClassName(hWnd, szClassName, MAX_PATH);
  1172. if (lstrcmp(szClassName, L"Windows.UI.Core.CoreWindow") == 0)
  1173. {
  1174. hIcon = GetUWPAppIcon(hWnd, IconSize);
  1175. }
  1176. if (hIcon == NULL && GetWindowLongPtr(hWnd, GWL_EXSTYLE) & (WS_EX_NOREDIRECTIONBITMAP))
  1177. {
  1178. HWND hUWP = FindWindowEx(hWnd, NULL, L"Windows.UI.Core.CoreWindow", NULL);
  1179. if (hUWP)
  1180. {
  1181. if (hUICoreWnd)
  1182. *hUICoreWnd = hUWP;
  1183. hIcon = GetUWPAppIcon(hUWP, IconSize);
  1184. }
  1185. else
  1186. {
  1187. TCHAR szApplicationFrameWindowTitle[MAX_PATH] = { 0 };
  1188. TCHAR szClassName[128] = { 0 };
  1189. TCHAR szCoreWindowTitle[MAX_PATH] = { 0 };
  1190. InternalGetWindowText(hWnd, szApplicationFrameWindowTitle, ARRAY_SIZEOF(szApplicationFrameWindowTitle));
  1191. HWND hCurrent = GetTopWindow(NULL);
  1192. do {
  1193. if (!IsHungAppWindow(hCurrent) &&
  1194. GetWindowLongPtr(hCurrent, GWLP_HWNDPARENT) == NULL &&
  1195. GetWindowLongPtr(hCurrent, GWL_EXSTYLE) & (WS_EX_NOREDIRECTIONBITMAP) &&
  1196. IsWindowEnabled(hCurrent)) {
  1197. GetClassName(hCurrent, szClassName, ARRAY_SIZEOF(szClassName));
  1198. if (lstrcmp(szClassName, L"Windows.UI.Core.CoreWindow") == 0) {
  1199. InternalGetWindowText(hCurrent, szCoreWindowTitle, ARRAY_SIZEOF(szCoreWindowTitle));
  1200. if (lstrstr(szApplicationFrameWindowTitle, szCoreWindowTitle))
  1201. {
  1202. if (hUICoreWnd)
  1203. *hUICoreWnd = hCurrent;
  1204. hIcon = GetUWPAppIcon(hCurrent, IconSize);
  1205. break;
  1206. }
  1207. }
  1208. }
  1209. } while ((hCurrent = GetNextWindow(hCurrent, GW_HWNDNEXT)) != NULL);
  1210. }
  1211. }
  1212. if (hIcon == NULL)
  1213. {
  1214. WCHAR szExe[MAX_PATH];
  1215. GetFileNameFromWindowHandle(hWnd, szExe, MAX_PATH);
  1216. SHFILEINFO shfi;
  1217. pSHGetFileInfo(szExe, 0, &shfi, sizeof(shfi), SHGFI_ICON);
  1218. hIcon = shfi.hIcon;
  1219. }
  1220. if (hIcon == NULL)
  1221. {
  1222. LRESULT dwResult = 1;
  1223. dwResult = SendMessageTimeout(hWnd, WM_GETICON, ICON_BIG, 0, SMTO_ABORTIFHUNG, 300, (PDWORD_PTR)&hIcon);
  1224. if (dwResult == 1)
  1225. {
  1226. if (hIcon == NULL)
  1227. hIcon = (HICON)GetClassLongPtr(hWnd, GCLP_HICON);
  1228. if (hIcon == NULL)
  1229. hIcon = (HICON)SendMessage(hWnd, WM_GETICON, ICON_SMALL, 0);
  1230. if (hIcon == NULL)
  1231. hIcon = (HICON)GetClassLongPtr(hWnd, GCLP_HICONSM);
  1232. if (hIcon == NULL)
  1233. {
  1234. WCHAR szExe[MAX_PATH];
  1235. GetFileNameFromWindowHandle(hWnd, szExe, MAX_PATH);
  1236. SHFILEINFO shfi;
  1237. pSHGetFileInfo(szExe, 0, &shfi, sizeof(shfi), SHGFI_ICON);
  1238. hIcon = shfi.hIcon;
  1239. }
  1240. }
  1241. }
  1242. else
  1243. *bUWP = TRUE;
  1244. /*
  1245. Gdiplus::Bitmap gIcon(hIcon);
  1246. Gdiplus::Bitmap bBitmap(IconSize, IconSize);
  1247. Gdiplus::Graphics gGraphics(&bBitmap);
  1248. gGraphics.SetInterpolationMode(InterpolationModeHighQuality);
  1249. gGraphics.DrawImage(&gIcon, 0, 0, IconSize, IconSize);
  1250. DestroyIcon(hIcon);
  1251. bBitmap.GetHICON(&hIcon);
  1252. */
  1253. return hIcon;
  1254. }
  1255. BOOL SetForeground(HWND hWnd)
  1256. {
  1257. bool bResult = false;
  1258. bool bHung = IsHungAppWindow(hWnd) != 0;
  1259. DWORD dwCurrentThreadId = 0, dwTargetThreadId = 0;
  1260. DWORD dwTimeout = 0;
  1261. dwCurrentThreadId = GetCurrentThreadId();
  1262. dwTargetThreadId = GetWindowThreadProcessId(hWnd, NULL);
  1263. if (IsIconic(hWnd)) {
  1264. // ShowWindow(hWnd,SW_RESTORE);
  1265. SendMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
  1266. }
  1267. if (!bHung) {
  1268. for (int i = 0; i < 10 && hWnd != GetForegroundWindow(); i++) {
  1269. dwCurrentThreadId = GetCurrentThreadId();
  1270. dwTargetThreadId = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
  1271. AttachThreadInput(dwCurrentThreadId, dwTargetThreadId, true);
  1272. SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
  1273. BringWindowToTop(hWnd);
  1274. AllowSetForegroundWindow(ASFW_ANY);
  1275. bResult = SetForegroundWindow(hWnd) != 0;
  1276. AttachThreadInput(dwCurrentThreadId, dwTargetThreadId, false);
  1277. Sleep(10);
  1278. }
  1279. }
  1280. else {
  1281. BringWindowToTop(hWnd);
  1282. bResult = SetForegroundWindow(hWnd) != 0;
  1283. }
  1284. return bResult;
  1285. /*
  1286. int tIdCur = GetWindowThreadProcessId(GetForegroundWindow(), NULL);//获取当前窗口句柄的线程ID
  1287. int tIdCurProgram = GetWindowThreadProcessId(hWnd,NULL);//获取当前运行程序线程ID
  1288. BOOL ret=AttachThreadInput(tIdCur, tIdCurProgram, 1);//是否能成功和当前自身进程所附加的输入上下文有关;
  1289. SetForegroundWindow(hWnd);
  1290. AttachThreadInput(tIdCur, tIdCurProgram, 0);
  1291. return ret;
  1292. */
  1293. }
  1294. void lstrlwr(WCHAR* wString, size_t SizeInWords)
  1295. {
  1296. for (size_t i = 0; i < SizeInWords; i++)
  1297. {
  1298. if ((wString[i] >= 'A') && (wString[i] <= 'Z'))
  1299. wString[i] += ('a' - 'A');
  1300. }
  1301. }
  1302. wchar_t* lstrstr(const wchar_t* str, const wchar_t* sub)
  1303. {
  1304. if (str == NULL || sub == NULL)
  1305. return NULL;
  1306. int iStrLen = lstrlen(str);
  1307. int iSubLen = lstrlen(sub);
  1308. if (iStrLen < iSubLen)
  1309. return NULL;
  1310. if (iStrLen != 0 && iSubLen == 0)
  1311. return NULL;
  1312. if (iStrLen == 0 && iSubLen == 0)
  1313. {
  1314. return (wchar_t*)str;
  1315. }
  1316. for (int i = 0; i < iStrLen; ++i)
  1317. {
  1318. int m = 0, n = i;
  1319. if (lstrlen(str + i) < iSubLen)
  1320. {
  1321. return NULL;
  1322. }
  1323. if (str[n] == sub[m])
  1324. {
  1325. while (str[n++] == sub[m++])
  1326. {
  1327. if (sub[m] == L'\0')
  1328. return (wchar_t*)str + i;
  1329. }
  1330. }
  1331. }
  1332. return NULL;
  1333. }
  1334. BOOL OpenProcessPath(DWORD dwProcessId)//通过进程ID打开进程的路径
  1335. {
  1336. BOOL ret = FALSE;
  1337. WCHAR szExplorer[MAX_PATH] = L"/select,";
  1338. WCHAR* sz;
  1339. int iLen = lstrlen(szExplorer);
  1340. sz = &szExplorer[iLen];
  1341. if (GetProcessFileName(dwProcessId, sz, MAX_PATH))
  1342. {
  1343. WCHAR szExe[MAX_PATH];
  1344. GetWindowsDirectory(szExe, MAX_PATH);
  1345. lstrcat(szExe, L"\\explorer.exe ");
  1346. lstrcat(szExe, szExplorer);
  1347. ret = RunProcess((LPTSTR)1, szExe);
  1348. }
  1349. return ret;
  1350. }
  1351. BOOL OpenWindowPath(HWND hWnd)
  1352. {
  1353. BOOL ret = FALSE;
  1354. DWORD dwProcessId;
  1355. GetWindowThreadProcessId(hWnd, &dwProcessId);
  1356. if (dwProcessId)
  1357. ret = OpenProcessPath(dwProcessId);
  1358. return ret;
  1359. }
  1360. HICON OpenProcessIcon(DWORD dProcessID, int cx)//通过进程ID ICON
  1361. {
  1362. HICON ret = NULL;
  1363. WCHAR szExe[MAX_PATH];
  1364. GetProcessFileName(dProcessID, szExe, MAX_PATH);
  1365. SHFILEINFO shellInfo;
  1366. pSHGetFileInfo(szExe, 0, &shellInfo, sizeof(shellInfo), SHGFI_ICON | SHGFI_SMALLICON);
  1367. ret = shellInfo.hIcon;
  1368. // ret = pExtractIcon(NULL, szExe, 0);;
  1369. return ret;
  1370. }
  1371. HICON GetIconForCSIDL(int csidl)
  1372. {
  1373. LPITEMIDLIST pidl = 0;
  1374. SHGetSpecialFolderLocation(NULL, csidl, &pidl);
  1375. if (pidl)
  1376. {
  1377. SHFILEINFO shellInfo;
  1378. pSHGetFileInfo(LPCTSTR(pidl), FILE_ATTRIBUTE_NORMAL, &shellInfo, sizeof(shellInfo), SHGFI_PIDL | SHGFI_ICON);
  1379. IMalloc* pMalloc;
  1380. SHGetMalloc(&pMalloc);
  1381. if (pMalloc)
  1382. {
  1383. pMalloc->Free(pidl);
  1384. pMalloc->Release();
  1385. }
  1386. return shellInfo.hIcon;
  1387. }
  1388. return 0;
  1389. }