| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421 |
- #include "Function.h"
- ////////////////////////////////////////////////////动态运行函数
- HRESULT pSHLoadIndirectString(LPCWSTR pszSource, LPWSTR pszOutBuf, UINT cchOutBuf, void** ppvReserved)
- {
- HRESULT ret = NULL;
- typedef UINT(WINAPI* pfnSHLoadIndirectString)(LPCWSTR pszSource, LPWSTR pszOutBuf, UINT cchOutBuf, void** ppvReserved);
- HMODULE hShell32 = LoadLibrary(L"Shlwapi.dll");
- if (hShell32)
- {
- pfnSHLoadIndirectString pSHLoadIndirectStringW = (pfnSHLoadIndirectString)GetProcAddress(hShell32, "SHLoadIndirectString");
- if (pSHLoadIndirectStringW)
- {
- ret = pSHLoadIndirectStringW(pszSource, pszOutBuf, cchOutBuf, ppvReserved);
- }
- FreeLibrary(hShell32);
- }
- return ret;
- }
- UINT pDragQueryFile(HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch)
- {
- UINT ret = NULL;
- typedef UINT(WINAPI* pfnDragQueryFile)(HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch);
- HMODULE hShell32 = LoadLibrary(L"shell32.dll");
- if (hShell32)
- {
- pfnDragQueryFile pDragQueryFileW = (pfnDragQueryFile)GetProcAddress(hShell32, "DragQueryFileW");
- if (pDragQueryFileW)
- {
- ret = pDragQueryFileW(hDrop, iFile, lpszFile, cch);
- }
- FreeLibrary(hShell32);
- }
- return ret;
- }
- HICON pExtractIcon(HINSTANCE hInst, LPCTSTR lpszExeFileName, UINT nIconIndex)
- {
- //IExtractIcon
- HICON ret = NULL;
- typedef HICON(WINAPI* pfnExtractIcon)(HINSTANCE hInst, LPCTSTR lpszExeFileName, UINT nIconIndex);
- HMODULE hShell32 = LoadLibrary(L"shell32.dll");
- if (hShell32)
- {
- pfnExtractIcon pExtractIconW = (pfnExtractIcon)GetProcAddress(hShell32, "ExtractIconW");
- if (pExtractIconW)
- {
- ret = pExtractIconW(hInst, lpszExeFileName, nIconIndex);
- }
- FreeLibrary(hShell32);
- }
- return ret;
- }
- DWORD pSHGetFileInfo(LPCTSTR pszPath, DWORD dwFileAttributes, SHFILEINFO FAR* psfi, UINT cbFileInfo, UINT uFlags)
- {
- //IExtractIcon
- DWORD ret = NULL;
- typedef DWORD(WINAPI* pfnSHGetFileInfo)(LPCTSTR pszPath, DWORD dwFileAttributes, SHFILEINFO FAR* psfi, UINT cbFileInfo, UINT uFlags);
- HMODULE hShell32 = LoadLibrary(L"shell32.dll");
- if (hShell32)
- {
- pfnSHGetFileInfo pSHGetFileInfoW = (pfnSHGetFileInfo)GetProcAddress(hShell32, "SHGetFileInfoW");
- if (pSHGetFileInfoW)
- {
- ret = pSHGetFileInfoW(pszPath, dwFileAttributes, psfi, cbFileInfo, uFlags);
-
- }
- FreeLibrary(hShell32);
- }
- return ret;
- }
- HRESULT pSHDefExtractIcon(LPCWSTR pszIconFile,int iIndex,UINT uFlags,HICON* phiconLarge,HICON* phiconSmall,UINT nIconSize)
- {
- //IExtractIcon
- HRESULT ret = NULL;
- typedef HRESULT(WINAPI* pfnSHDefExtractIcon)(LPCWSTR pszIconFile, int iIndex, UINT uFlags, HICON* phiconLarge, HICON* phiconSmall, UINT nIconSize);
- HMODULE hShell32 = LoadLibrary(L"shell32.dll");
- if (hShell32)
- {
- pfnSHDefExtractIcon SHDefExtractIconW = (pfnSHDefExtractIcon)GetProcAddress(hShell32, "SHDefExtractIconW");
- if (SHDefExtractIconW)
- {
- ret = SHDefExtractIconW(pszIconFile, iIndex, uFlags, phiconLarge, phiconSmall, nIconSize);
- }
- FreeLibrary(hShell32);
- }
- return ret;
- }
- HINSTANCE pShellExecute(_In_opt_ HWND hwnd, _In_opt_ LPCWSTR lpOperation, _In_ LPCWSTR lpFile, _In_opt_ LPCWSTR lpParameters, _In_opt_ LPCWSTR lpDirectory, _In_ INT nShowCmd)
- {
- HINSTANCE hInstance = NULL;
- 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);
- HMODULE hShell32 = LoadLibrary(L"shell32.dll");
- if (hShell32)
- {
- pfnShellExecute pShellExecuteW = (pfnShellExecute)GetProcAddress(hShell32, "ShellExecuteW");
- if (pShellExecuteW)
- hInstance = pShellExecuteW(hwnd, lpOperation, lpFile, lpParameters, lpDirectory, nShowCmd);
- FreeLibrary(hShell32);
- }
- return hInstance;
- }
- BOOL pShell_NotifyIcon(DWORD dwMessage, _In_ PNOTIFYICONDATAW lpData)
- {
- typedef BOOL(WINAPI* pfnShell_NotifyIcon)(DWORD dwMessage, _In_ PNOTIFYICONDATAW lpData);
- HMODULE hShell32 = LoadLibrary(L"shell32.dll");
- BOOL ret = FALSE;
- if (hShell32)
- {
- pfnShell_NotifyIcon pShell_NotifyIconW = (pfnShell_NotifyIcon)GetProcAddress(hShell32, "Shell_NotifyIconW");
- if (pShell_NotifyIconW)
- ret = pShell_NotifyIconW(dwMessage, lpData);
- FreeLibrary(hShell32);
- }
- return ret;
- }
- BOOL pWTSQueryUserToken(ULONG SessionId, PHANDLE phToken)
- {
- BOOL ret = FALSE;
- typedef BOOL(WINAPI* pfnWTSQueryUserToken)(ULONG SessionId, PHANDLE phToken);
- HMODULE hWTSAPI32 = LoadLibrary(L"wtsapi32.dll");
- if (hWTSAPI32)
- {
- pfnWTSQueryUserToken WTSQueryUserToken = (pfnWTSQueryUserToken)GetProcAddress(hWTSAPI32, "WTSQueryUserToken");
- if (WTSQueryUserToken)
- ret = WTSQueryUserToken(SessionId, phToken);
- FreeLibrary(hWTSAPI32);
- }
- return ret;
- }
- BOOL pCreateEnvironmentBlock(_At_((PZZWSTR*)lpEnvironment, _Outptr_)LPVOID* lpEnvironment, _In_opt_ HANDLE hToken, _In_ BOOL bInherit)
- {
- BOOL ret = FALSE;
- typedef BOOL(WINAPI* pfnCreateEnvironmentBlock)(_At_((PZZWSTR*)lpEnvironment, _Outptr_)LPVOID* lpEnvironment, _In_opt_ HANDLE hToken, _In_ BOOL bInherit);
- HMODULE hUserenv = LoadLibrary(L"userenv.dll");
- if (hUserenv)
- {
- pfnCreateEnvironmentBlock CreateEnvironmentBlock = (pfnCreateEnvironmentBlock)GetProcAddress(hUserenv, "CreateEnvironmentBlock");
- if (CreateEnvironmentBlock)
- ret = CreateEnvironmentBlock(lpEnvironment, hToken, bInherit);
- FreeLibrary(hUserenv);
- }
- return ret;
- }
- 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)
- {
- ULONG ret = -1;
- 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);
- HMODULE hPowrptof = LoadLibrary(L"powrprof.dll");
- if (hPowrptof)
- {
- pfnCallNtPowerInformation CallNtPowerInformation = (pfnCallNtPowerInformation)GetProcAddress(hPowrptof, "CallNtPowerInformation");
- if (CallNtPowerInformation)
- ret = CallNtPowerInformation(InformationLevel, InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength);
- FreeLibrary(hPowrptof);
- }
- return ret;
- }
- BOOL LaunchAppIntoDifferentSession(WCHAR* szExe, WCHAR* szDir, WCHAR* szLine)//以SYSTEM运行程序并可以交互窗口
- {
- PROCESS_INFORMATION pi;
- STARTUPINFO si;
- BOOL bResult = FALSE;
-
- DWORD winlogonPid;
- ULONG dwSessionId;
- HANDLE hUserToken, hUserTokenDup = NULL, hPToken = NULL, hProcess;
- DWORD dwCreationFlags;
-
- // Log the client on to the local computer.
-
- dwSessionId = WTSGetActiveConsoleSessionId();
-
- //////////////////////////////////////////
- // Find the winlogon process
- ////////////////////////////////////////
-
- PROCESSENTRY32 procEntry;
-
- HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
- if (hSnap == INVALID_HANDLE_VALUE)
- {
- return FALSE;
- }
-
- procEntry.dwSize = sizeof(PROCESSENTRY32);
-
- if (!Process32First(hSnap, &procEntry))
- {
- return FALSE;
- }
-
- do
- {
- if (lstrcmpi(procEntry.szExeFile, L"winlogon.exe") == 0)
- {
- // We found a winlogon process...
- // make sure it's running in the console session
- DWORD winlogonSessId = 0;
- if (ProcessIdToSessionId(procEntry.th32ProcessID, &winlogonSessId)
- && winlogonSessId == dwSessionId)
- {
- winlogonPid = procEntry.th32ProcessID;
- break;
- }
- }
-
- } while (Process32Next(hSnap, &procEntry));
-
- ////////////////////////////////////////////////////////////////////////
-
- pWTSQueryUserToken(dwSessionId, &hUserToken);
- dwCreationFlags = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;
- memset(&si, 0, sizeof(STARTUPINFO));
- si.cb = sizeof(STARTUPINFO);
- si.lpDesktop = (LPWSTR)L"winsta0\\default";
- memset(&pi, 0, sizeof(pi));
- TOKEN_PRIVILEGES tp;
- LUID luid;
- hProcess = OpenProcess(MAXIMUM_ALLOWED, FALSE, winlogonPid);
- if (hProcess)
- {
- if (!::OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY
- | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | TOKEN_ADJUST_SESSIONID
- | TOKEN_READ | TOKEN_WRITE, &hPToken))
- {
- // int abcd = GetLastError();
- // printf("Process token open Error: %u\n", GetLastError());
- }
-
- if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
- {
- // printf("Lookup Privilege value Error: %u\n", GetLastError());
- }
- tp.PrivilegeCount = 1;
- tp.Privileges[0].Luid = luid;
- tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
-
- DuplicateTokenEx(hPToken, MAXIMUM_ALLOWED, NULL,
- SecurityIdentification, TokenPrimary, &hUserTokenDup);
- int dup = GetLastError();
-
- //Adjust Token privilege
- SetTokenInformation(hUserTokenDup,
- TokenSessionId, (LPVOID)dwSessionId, sizeof(ULONG));
-
- if (!AdjustTokenPrivileges(hUserTokenDup, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),
- (PTOKEN_PRIVILEGES)NULL, NULL))
- {
- // int abc = GetLastError();
- // printf("Adjust Privilege value Error: %u\n", GetLastError());
- }
-
- if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
- {
- // printf("Token does not have the provilege\n");
- }
-
- LPVOID pEnv = NULL;
-
- if (pCreateEnvironmentBlock(&pEnv, hUserTokenDup, TRUE))
- {
- dwCreationFlags |= CREATE_UNICODE_ENVIRONMENT;
- }
- else
- pEnv = NULL;
-
- // Launch the process in the client's logon session.
-
- bResult = CreateProcessAsUser(
- hUserTokenDup, // client's access token
- szExe, // file to execute
- szLine, // command line
- NULL, // pointer to process SECURITY_ATTRIBUTES
- NULL, // pointer to thread SECURITY_ATTRIBUTES
- FALSE, // handles are not inheritable
- dwCreationFlags, // creation flags
- pEnv, // pointer to new environment block
- szDir, // name of current directory
- &si, // pointer to STARTUPINFO structure
- &pi // receives information about new process
- );
- }
- if (hProcess)
- {
- CloseHandle(hProcess);
- CloseHandle(hUserToken);
- CloseHandle(hUserTokenDup);
- CloseHandle(hPToken);
- }
- return bResult;
- }
- //////////////////////////////////////////////////////////////////////////服务函数
- BOOL bInstallService;
- SERVICE_STATUS_HANDLE hServiceStatus;
- SERVICE_STATUS status;
- HANDLE hEvent = INVALID_HANDLE_VALUE;
- void InitService()//初始化服务参数
- {
- hServiceStatus = NULL;
- status.dwServiceType = SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS;
- status.dwCurrentState = SERVICE_STOPPED;
- status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
- status.dwWin32ExitCode = 0;
- status.dwServiceSpecificExitCode = 0;
- status.dwCheckPoint = 0;
- status.dwWaitHint = 0;
- }
- void WINAPI ServiceStrl(DWORD dwOpcode)//服务控制函数
- {
- switch (dwOpcode)
- {
- case SERVICE_CONTROL_STOP:
- status.dwCurrentState = SERVICE_STOP_PENDING;
- SetServiceStatus(hServiceStatus, &status);
- //告诉服务线程停止工作
- ::SetEvent(hEvent);
- break;
- case SERVICE_CONTROL_PAUSE:
- break;
- case SERVICE_CONTROL_CONTINUE:
- break;
- case SERVICE_CONTROL_INTERROGATE:
- break;
- case SERVICE_CONTROL_SHUTDOWN:
- break;
- default:
- break;
- }
- }
- void WINAPI ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv)//服务主线程入口
- {
- // Register the control request handler
- status.dwCurrentState = SERVICE_START_PENDING;
- status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
- //注册服务控制
- hServiceStatus = RegisterServiceCtrlHandler(lpServiceName, ServiceStrl);
- if (hServiceStatus == NULL)
- {
- return;
- }
- SetServiceStatus(hServiceStatus, &status);
- //如下代码可以为启动服务前的准备工作
- hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
- if (hEvent == NULL)
- {
- status.dwCurrentState = SERVICE_STOPPED;
- SetServiceStatus(hServiceStatus, &status);
- return;
- }
- //更改服务状态为启动
- status.dwWin32ExitCode = S_OK;
- status.dwCheckPoint = 0;
- status.dwWaitHint = 0;
- status.dwCurrentState = SERVICE_RUNNING;
- SetServiceStatus(hServiceStatus, &status);
- //等待用户选择停止服务,
- //当然你也可以把你的服务代码用线程来执行,
- //此时这里只需等待线程结束既可。
- // CloseHandle(CreateFile(L"d:\\topc.txt", GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_ALWAYS, NULL, NULL));
- WCHAR szExe[MAX_PATH];
- HINSTANCE hInst = GetModuleHandle(NULL);
- GetModuleFileName(hInst, szExe, MAX_PATH);
- size_t iLen = wcslen(szExe);
- szExe[iLen] = L'\0';
- WCHAR szLine[] = L" t";
- // CreateProcessByExplorer(szExe, NULL, NULL);
- LaunchAppIntoDifferentSession(szExe, NULL, szLine);
- while (WaitForSingleObject(hEvent, 1000) != WAIT_OBJECT_0)
- {
- }
- //停止服务
- status.dwCurrentState = SERVICE_STOPPED;
- SetServiceStatus(hServiceStatus, &status);
- }
- DWORD ServiceRunState()//服务运行状态
- {
- BOOL bResult = FALSE;
- //打开服务控制管理器
- SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
- if (hSCM != NULL)
- {
- //打开服务
- SC_HANDLE hService = ::OpenService(hSCM, lpServiceName, SERVICE_QUERY_STATUS);
- if (hService != NULL)
- {
- SERVICE_STATUS ss;
- QueryServiceStatus(hService, &ss);
- bResult = ss.dwCurrentState;
- ::CloseServiceHandle(hService);
- }
- ::CloseServiceHandle(hSCM);
- }
- return bResult;
- }
- BOOL IsServiceInstalled()//服务是否已经安装
- {
- BOOL bResult = FALSE;
- //打开服务控制管理器
- SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
- if (hSCM != NULL)
- {
- //打开服务
- SC_HANDLE hService = ::OpenService(hSCM, lpServiceName, SERVICE_QUERY_CONFIG);
- if (hService != NULL)
- {
- bResult = TRUE;
- ::CloseServiceHandle(hService);
- }
- ::CloseServiceHandle(hSCM);
- }
- return bResult;
- }
- BOOL InstallService()//安装服务
- {
- if (IsServiceInstalled())
- return TRUE;
- //打开服务控制管理器
- SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
- if (hSCM == NULL)
- {
- return FALSE;
- }
- // Get the executable file path
- TCHAR szFilePath[MAX_PATH];
- ::GetModuleFileName(NULL, szFilePath, MAX_PATH);
- //创建服务
- SC_HANDLE hService = ::CreateService(
- hSCM,
- lpServiceName,
- lpServiceName,
- SERVICE_ALL_ACCESS,
- SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,
- SERVICE_AUTO_START, //如果为SERVICE_DEMAND_START则表示此服务需手工启动
- SERVICE_ERROR_NORMAL,
- szFilePath,
- NULL,
- NULL,
- L"",
- NULL,
- NULL);
- if (hService == NULL)
- {
- ::CloseServiceHandle(hSCM);
- return FALSE;
- }
- ::CloseServiceHandle(hService);
- ::CloseServiceHandle(hSCM);
- return TRUE;
- }
- BOOL UninstallService()//卸载服务
- {
- if (!IsServiceInstalled())
- return TRUE;
- SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
- if (hSCM == NULL)
- {
- return FALSE;
- }
- SC_HANDLE hService = ::OpenService(hSCM, lpServiceName, SERVICE_STOP | DELETE);
- if (hService == NULL)
- {
- ::CloseServiceHandle(hSCM);
- return FALSE;
- }
- SERVICE_STATUS status;
- ::ControlService(hService, SERVICE_CONTROL_STOP, &status);
- //删除服务
- BOOL bDelete = ::DeleteService(hService);
- ::CloseServiceHandle(hService);
- ::CloseServiceHandle(hSCM);
- if (bDelete)
- return TRUE;
- return FALSE;
- }
- BOOL ServiceCtrlStart()//开启服务
- {
- BOOL bRet;
- SC_HANDLE hSCM;
- SC_HANDLE hService;
- hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
- if (hSCM != NULL)
- {
- // hService = OpenService(hSCM, szServiceName, SERVICE_START);
- hService = OpenService(hSCM, lpServiceName, SERVICE_ALL_ACCESS);
- if (hService != NULL)
- {
- TCHAR szFilePath[MAX_PATH];
- ::GetModuleFileName(NULL, szFilePath, MAX_PATH);
- ChangeServiceConfig(hService, SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START, SERVICE_NO_CHANGE, szFilePath, NULL, NULL, NULL, NULL, NULL, NULL);
- //开始Service
- bRet = StartService(hService, 0, NULL);
- CloseServiceHandle(hService);
- }
- else
- {
- bRet = FALSE;
- }
- CloseServiceHandle(hSCM);
- }
- else
- {
- bRet = FALSE;
- }
- return bRet;
- }
- BOOL ServiceCtrlStop()//停止服务
- {
- BOOL bRet;
- SC_HANDLE hSCM;
- SC_HANDLE hService;
- SERVICE_STATUS ServiceStatus;
- hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
- if (hSCM != NULL)
- {
- hService = OpenService(hSCM, lpServiceName, SERVICE_STOP | SERVICE_QUERY_STATUS);
- if (hService != NULL)
- {
- QueryServiceStatus(hService, &ServiceStatus);
- if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
- {
- bRet = ControlService(hService, SERVICE_CONTROL_STOP, &ServiceStatus);
- }
- else
- {
- bRet = FALSE;
- }
- CloseServiceHandle(hService);
- }
- else
- {
- bRet = FALSE;
- }
- CloseServiceHandle(hSCM);
- }
- else
- {
- bRet = FALSE;
- }
- return bRet;
- }
- int GetScreenRect(HWND hWnd, LPRECT lpRect, BOOL bTray)//获取窗口所在的屏幕大小可减去任务栏
- {
- HMONITOR hMon = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);
- MONITORINFO mi;
- mi.cbSize = sizeof mi;
- GetMonitorInfo(hMon, &mi);
- if (bTray)
- {
- RECT TrayRect;
- if (mi.rcMonitor.left == 0 && mi.rcMonitor.top == 0)
- {
- HWND hTrayWnd = ::FindWindow(szShellTray, NULL);
- GetWindowRect(hTrayWnd, &TrayRect);
- }
- else
- {
- HWND hSecondaryTray;
- hSecondaryTray = FindWindow(szSecondaryTray, NULL);
- while (hSecondaryTray)
- {
- GetWindowRect(hSecondaryTray, &TrayRect);
- POINT pt;
- pt.x = TrayRect.left;
- pt.y = TrayRect.top;
- if (PtInRect(lpRect, pt))
- break;
- hSecondaryTray = FindWindowEx(NULL, hSecondaryTray, szSecondaryTray, NULL);
- }
- }
- RECT dRect;
- SubtractRect(&dRect, &mi.rcMonitor, &TrayRect);
- CopyRect(lpRect, &dRect);
- }
- else
- CopyRect(lpRect, &mi.rcMonitor);
- return 0;
- }
- typedef struct _PROCESS_BASIC_INFORMATION
- {
- PVOID Reserved1;
- DWORD PebBaseAddress;
- PVOID Reserved2[2];
- ULONG_PTR UniqueProcessId;
- ULONG InheritedFromUniqueProcessId;
- }PROCESS_BASIC_INFORMATION;
- typedef LONG(WINAPI* pfnNtQueryInformationProcess)(HANDLE, UINT, PVOID, ULONG, PULONG);
- DWORD GetParentProcessID(DWORD dwProcessId)//获取父进程ID
- {
- if (dwProcessId == -1)
- return -1;
- LONG status;
- DWORD dwParentPID = (DWORD)-1;
- HANDLE hProcess;
- PROCESS_BASIC_INFORMATION pbi;
- pfnNtQueryInformationProcess NtQueryInformationProcess = (pfnNtQueryInformationProcess)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQueryInformationProcess");
- if (NULL == NtQueryInformationProcess)
- return (DWORD)-1;
- hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcessId);
- if (!hProcess)
- {
- hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwProcessId);
- }
- if (!hProcess)
- return (DWORD)-1;
- status = NtQueryInformationProcess(hProcess, 0, (PVOID)&pbi, sizeof(PROCESS_BASIC_INFORMATION), NULL);
- if (!status)
- dwParentPID = pbi.InheritedFromUniqueProcessId;
- CloseHandle(hProcess);
- return dwParentPID;
- }
- BOOL GetSetVolume(BOOL bSet, HWND hWnd, DWORD dwProcessId, float* fVolume, BOOL* bMute, BOOL IsMixer)
- {
- DWORD dwCProcessId = -1;
- if (hWnd)
- GetWindowThreadProcessId(hWnd, &dwProcessId);
- BOOL ret = FALSE;
- HRESULT hr = S_OK;
- IMMDeviceCollection* pMultiDevice = NULL;
- IMMDevice* pDevice = NULL;
- IAudioSessionEnumerator* pSessionEnum = NULL;
- IAudioSessionManager2* pASManager = NULL;
- IMMDeviceEnumerator* m_pEnumerator = NULL;
- const IID IID_ISimpleAudioVolume = __uuidof(ISimpleAudioVolume);
- const IID IID_IAudioSessionControl2 = __uuidof(IAudioSessionControl2);
-
- GUID m_guidMyContext;
- CoInitialize(NULL);
- hr = CoCreateGuid(&m_guidMyContext);
- if (CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&m_pEnumerator) == S_OK)
- {
- if (IsMixer)
- {
- hr = m_pEnumerator->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &pMultiDevice);
- }
- else
- {
- hr = m_pEnumerator->EnumAudioEndpoints(eCapture, DEVICE_STATE_ACTIVE, &pMultiDevice);
- }
- if (hr == S_OK)
- {
- UINT deviceCount = 0;
- if (pMultiDevice->GetCount(&deviceCount) == S_OK)
- {
- for (UINT ii = 0; ii < deviceCount; ii++)
- {
- pDevice = NULL;
- if (pMultiDevice->Item(ii, &pDevice) == S_OK)
- {
- if (pDevice->Activate(__uuidof(IAudioSessionManager), CLSCTX_ALL, NULL, (void**)&pASManager) == S_OK)
- {
- if (pASManager->GetSessionEnumerator(&pSessionEnum) == S_OK)
- {
- int nCount;
- if (pSessionEnum->GetCount(&nCount) == S_OK)
- {
- for (int i = 0; i < nCount; i++)
- {
- IAudioSessionControl* pSessionCtrl;
- if (pSessionEnum->GetSession(i, &pSessionCtrl) == S_OK)
- {
- IAudioSessionControl2* pSessionCtrl2;
- if (pSessionCtrl->QueryInterface(IID_IAudioSessionControl2, (void**)&pSessionCtrl2) == S_OK)
- {
- ULONG pid;
- if (pSessionCtrl2->GetProcessId(&pid) == S_OK)
- {
- ISimpleAudioVolume* pSimplevol;
- if (pSessionCtrl2->QueryInterface(IID_ISimpleAudioVolume, (void**)&pSimplevol) == S_OK)
- {
- if (pid == dwProcessId || dwProcessId == GetParentProcessID(pid))
- {
- if (bSet)
- {
- if (fVolume)
- pSimplevol->SetMasterVolume(*fVolume, NULL);
- if (bMute)
- pSimplevol->SetMute(*bMute, NULL);
- }
- else
- {
- if (fVolume)
- {
- pSimplevol->GetMasterVolume(fVolume);
- }
- if (bMute)
- {
- pSimplevol->GetMute(bMute);
- }
- }
- ret = TRUE;
- }
- pSimplevol->Release();
- }
- }
- pSessionCtrl2->Release();
- }
- pSessionCtrl->Release();
- }
- }
- }
- pSessionEnum->Release();
- }
- pASManager->Release();
- }
- pDevice->Release();
- }
- }
- }
- pMultiDevice->Release();
- }
- m_pEnumerator->Release();
- }
- CoUninitialize();
- return ret;
- }
- BOOL EnableDebugPrivilege(BOOL bEnableDebugPrivilege)//DEBUG提权
- {
- HANDLE hToken;
- TOKEN_PRIVILEGES tp;
- if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
- {
- if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid))
- {
- tp.PrivilegeCount = 1;
- if (bEnableDebugPrivilege)
- tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
- else
- tp.Privileges[0].Attributes = 0;
- if (AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL))
- {
- ::CloseHandle(hToken);
- return TRUE;
- }
- }
- CloseHandle(hToken);
- }
- return FALSE;
- }
- BOOL IsUserAdmin()//判断是以管理员权限运行
- {
- // IsUserAnAdmin();
- BOOL b;
- SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
- PSID AdministratorsGroup;
- b = AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &AdministratorsGroup);
- if (b)
- {
- if (!CheckTokenMembership(NULL, AdministratorsGroup, &b))
- {
- b = FALSE;
- }
- FreeSid(AdministratorsGroup);
- }
- return(b);
- }
- void SetToCurrentPath()
- {
- WCHAR szDir[MAX_PATH];
- GetModuleFileName(NULL, szDir, MAX_PATH);
- int len = lstrlen(szDir);
- for (int i = len - 1; i > 0; i--)
- {
- if (szDir[i] == '\\')
- {
- szDir[i] = 0;
- SetCurrentDirectory(szDir);
- break;
- }
- }
- }
- BOOL RunProcess(LPTSTR szExe, const WCHAR* szCommandLine)
- {
- BOOL ret = FALSE;
- STARTUPINFO StartInfo;
- PROCESS_INFORMATION procStruct;
- memset(&StartInfo, 0, sizeof(STARTUPINFO));
- StartInfo.cb = sizeof(STARTUPINFO);
- WCHAR* sz;
- WCHAR szName[MAX_PATH];
- if (szExe == (LPTSTR)1)
- sz = NULL;
- else if (szExe)
- sz = szExe;
- else
- {
- GetModuleFileName(NULL, szName, MAX_PATH);
- sz = szName;
- }
- WCHAR szLine[MAX_PATH];
- lstrcpy(szLine, szCommandLine);
- ret = CreateProcess(sz,// RUN_TEST.bat位于工程所在目录下
- szLine,
- NULL,
- NULL,
- FALSE,
- NULL,// 这里不为该进程创建一个控制台窗口
- NULL,
- NULL,
- &StartInfo, &procStruct);
- CloseHandle(procStruct.hProcess);
- CloseHandle(procStruct.hThread);
- // SetTimer(hMain, 11, 1000, NULL);
- return ret;
- }
- void SetTaskScheduler(BOOL bDelAdd, const WCHAR* szName)///////////////////////////////////设置开机任务计划/删除任务计划
- {
- SetToCurrentPath();
- WCHAR szDelSchtasks[MAX_PATH];
- wsprintf(szDelSchtasks, L" s/Delete /TN %s /F", szName);
- RunProcess(NULL, szDelSchtasks);
- Sleep(300);
- if (bDelAdd)
- {
-
- 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>";
- 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>";
- WCHAR sXML[4096];
- WCHAR szExe[MAX_PATH];
- GetModuleFileName(NULL, szExe, MAX_PATH);
- // LoadString(hInst, IDS_XML1, szXML, 2048);
- if (IsUserAdmin())
- {
- wsprintf(sXML, szXML1, szName, L" ", L"<RunLevel>HighestAvailable</RunLevel><GroupId>Builtin\\Administrators</GroupId>");
- // LoadString(hInst, IDS_XML2, szXML, 2048);
- int iLen = lstrlen(sXML);
- wsprintf(&sXML[iLen], szXML2, szExe);
- }
- else
- {
- WCHAR szUserName[64];
- DWORD dwLen = 64;
- GetUserName(szUserName, &dwLen);
- WCHAR szID[64];
- wsprintf(szID, L"<UserId>%s</UserId>", szUserName);
- WCHAR szUserID[128];
- wsprintf(szUserID, L"<UserId>%s</UserId><LogonType>InteractiveToken</LogonType>", szUserName);
- wsprintf(sXML, szXML1, szName, szID, szUserID);
- // LoadString(hInst, IDS_XML2, szXML, 2048);
- int iLen = lstrlen(sXML);
- wsprintf(&sXML[iLen], szXML2, szExe);
- }
- WCHAR szFileName[64];
- wsprintf(szFileName, L"%s.xml", szName);
- HANDLE hFile = CreateFile(szFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL);
- if (hFile)
- {
- DWORD dwBytes;
- WORD unicode_identifier = 0xfeff;
- WriteFile(hFile, &unicode_identifier, sizeof(WORD), &dwBytes, NULL);
- WriteFile(hFile, sXML, (DWORD)lstrlen(sXML) * 2, &dwBytes, NULL);
- CloseHandle(hFile);
- }
- WCHAR szCreateSchtasks[MAX_PATH];
- wsprintf(szCreateSchtasks, L" s/create /XML %s.xml /tn %s", szName, szName);
- // WCHAR szRunSchtasks[] = L" s/Run /TN TaryS";
- RunProcess(NULL, szCreateSchtasks);
- // RunProcess(szRunSchtasks);
- }
- }
- BOOL AutoRun(BOOL GetSet, BOOL bAutoRun,const WCHAR* szName)//读取、设置开机启动、关闭开机启动
- {
- // UninstallService();
- BOOL ret = FALSE;
- /*
- if (GetSet == FALSE)
- {
- WCHAR szExe[MAX_PATH];
- GetSystemDirectory(szExe, MAX_PATH);
- lstrcat(szExe, L"\\schtasks.exe");
- DWORD exitCode = 0;
- PROCESS_INFORMATION pInfo = { 0 };
- STARTUPINFO sInfo = { 0 };
- sInfo.cb = sizeof(STARTUPINFO);
- sInfo.wShowWindow = SW_HIDE;
- WCHAR szCommandLine[MAX_PATH];
- lstrcpy(szCommandLine, L"/Query /TN ");
- lstrcat(szCommandLine,szName);
- if (CreateProcess(szExe, szCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &sInfo, &pInfo))
- {
- // Wait until child process exits.
- WaitForSingleObject(pInfo.hProcess, INFINITE);
-
- if (GetExitCodeProcess(pInfo.hProcess, &exitCode))
- {
- CloseHandle(pInfo.hProcess);
- CloseHandle(pInfo.hThread);
- if (exitCode == 0)
- return TRUE;
- }
- else
- {
- CloseHandle(pInfo.hProcess);
- CloseHandle(pInfo.hThread);
- }
- }
- }
- */
- WCHAR sFileName[MAX_PATH];
- sFileName[0] = L'\"';
- GetModuleFileName(NULL, &sFileName[1], MAX_PATH);
- int sLen = lstrlen(sFileName);
- sFileName[sLen] = L'\"';
- sFileName[sLen + 1] = L' ';
- sFileName[sLen + 2] = L't';
- sFileName[sLen + 3] = L'\0';
- if (IsUserAdmin())
- {
- if (GetSet)
- {
- HKEY pKey;
- RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", NULL, KEY_ALL_ACCESS, &pKey);
- if (pKey)
- {
- RegDeleteValue(pKey, szName);
- RegCloseKey(pKey);
- }
- RegOpenKeyEx(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", NULL, KEY_ALL_ACCESS, &pKey);
- if (pKey)
- {
- RegDeleteValue(pKey, szName);
- RegCloseKey(pKey);
- }
- if (bAutoRun)
- {
- SetTaskScheduler(TRUE, szName);
- InstallService();
- }
- else
- {
- SetTaskScheduler(FALSE, szName);
- if (IsServiceInstalled())
- UninstallService();
- }
- }
- else
- {
- return IsServiceInstalled();
- }
- }
- else
- {
- HKEY pKey;
- RegOpenKeyEx(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", NULL, KEY_ALL_ACCESS, &pKey);
- if (pKey)
- {
- if (GetSet)
- {
- if (bAutoRun)
- {
- SetTaskScheduler(TRUE, szName);
- RegSetValueEx(pKey, szName, NULL, REG_SZ, (BYTE*)sFileName, (DWORD)lstrlen(sFileName) * 2);
- }
- else
- {
- SetTaskScheduler(FALSE, szName);
- RegDeleteValue(pKey, szName);
- }
- ret = TRUE;
- }
- else
- {
- WCHAR nFileName[MAX_PATH];
- DWORD cbData = MAX_PATH * sizeof WCHAR;
- DWORD dType = REG_SZ;
- if (RegQueryValueEx(pKey, szName, NULL, &dType, (LPBYTE)nFileName, &cbData) == ERROR_SUCCESS)
- {
- if (lstrcmp(sFileName, nFileName) == 0)
- ret = TRUE;
- else
- ret = FALSE;
- }
- }
- RegCloseKey(pKey);
- }
- }
- return ret;
- }
- BOOL SetWindowCompositionAttribute(HWND hWnd, ACCENT_STATE mode, DWORD AlphaColor)//设置窗口WIN10风格
- {
- pfnSetWindowCompositionAttribute pSetWindowCompositionAttribute = NULL;
- if (mode == ACCENT_DISABLED)
- {
- // if (bAccentNormal == FALSE)
- {
- SendMessage(hWnd, WM_THEMECHANGED, 0, 0);
- // bAccentNormal = TRUE;
- }
- return TRUE;
- }
- // bAccentNormal = FALSE;
- BOOL ret = FALSE;
- HMODULE hUser = GetModuleHandle(L"user32.dll");
- if (hUser)
- pSetWindowCompositionAttribute = (pfnSetWindowCompositionAttribute)GetProcAddress(hUser, "SetWindowCompositionAttribute");
- if (pSetWindowCompositionAttribute)
- {
- ACCENT_POLICY accent = { mode, 2, AlphaColor, 0 };
- _WINDOWCOMPOSITIONATTRIBDATA data;
- data.Attrib = WCA_ACCENT_POLICY;
- data.pvData = &accent;
- data.cbData = sizeof(accent);
- ret = pSetWindowCompositionAttribute(hWnd, &data);
- }
- return ret;
- }
- /*
- typedef BOOL(WINAPI*pfnGetWindowCompositionAttribute)(HWND, struct _WINDOWCOMPOSITIONATTRIBDATA*);
- BOOL GetWindowCompositionAttribute(HWND hWnd, ACCENT_POLICY * accent)
- {
- BOOL ret = FALSE;
- HMODULE hUser = GetModuleHandle(L"user32.dll");
- if (hUser)
- {
- pfnGetWindowCompositionAttribute getWindowCompositionAttribute = (pfnGetWindowCompositionAttribute)GetProcAddress(hUser, "GetWindowCompositionAttribute");
- if (getWindowCompositionAttribute)
- {
- _WINDOWCOMPOSITIONATTRIBDATA data;
- ACCENT_POLICY acc[2];
- data.Attrib = WCA_ACCENT_POLICY;
- data.pvData = acc;
- data.cbData = sizeof ACCENT_POLICY * 2;
- ret = getWindowCompositionAttribute(hWnd, &data);
- }
- }
- return ret;
- }
- */
- BOOL GetProcessFileName(DWORD dwProcessId, LPTSTR pszFileName, DWORD dwFileNameLength)
- {
- BOOL bResult = false;
- HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessId);
- if (hProc == NULL)
- hProc = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwProcessId);
- if (hProc)
- {
- HMODULE hPSAPI = LoadLibrary(L"psapi.dll");
- if (hPSAPI)
- {
- typedef DWORD(WINAPI* pfnGetModuleFileNameEx)(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize);
- pfnGetModuleFileNameEx pGetModuleFileNameEx = (pfnGetModuleFileNameEx)GetProcAddress(hPSAPI, "GetModuleFileNameExW");
- bResult = pGetModuleFileNameEx(hProc, NULL, pszFileName, dwFileNameLength);
- if (bResult == 0)
- {
- typedef WINUSERAPI BOOL WINAPI QUERYFULLPROCESSIMAGENAME(HANDLE hProcess, DWORD dwFlags, LPTSTR lpExeName, PDWORD lpdwSize);
- QUERYFULLPROCESSIMAGENAME* pQueryFullProcessImageName = (QUERYFULLPROCESSIMAGENAME*)GetProcAddress(GetModuleHandleA("Kernel32.dll"), "QueryFullProcessImageNameW");
- if (pQueryFullProcessImageName)
- {
- DWORD dwSize = dwFileNameLength;
- bResult = pQueryFullProcessImageName(hProc, 0, pszFileName, &dwSize);
- }
- }
- FreeLibrary(hPSAPI);
- if (bResult == FALSE)
- bResult = GetProcessImageFileName(hProc, pszFileName, dwFileNameLength);
- }
- CloseHandle(hProc);
- }
- return bResult;
- }
- bool GetFileNameFromWindowHandle(HWND hWnd, LPTSTR lpFileName, DWORD dwFileNameLength)
- {
- bool bResult = false;
- DWORD dwProcessId = 0;
-
- if (GetWindowThreadProcessId(hWnd, &dwProcessId) != 0)
- {
- bResult = GetProcessFileName(dwProcessId, lpFileName, dwFileNameLength);
- }
- return bResult;
- }
- typedef struct PACKAGE_VERSION {
- union {
- UINT64 Version;
- struct {
- USHORT Revision;
- USHORT Build;
- USHORT Minor;
- USHORT Major;
- } DUMMYSTRUCTNAME;
- } DUMMYUNIONNAME;
- } PACKAGE_VERSION;
- typedef struct PACKAGE_ID {
- UINT32 reserved;
- UINT32 processorArchitecture;
- PACKAGE_VERSION version;
- PWSTR name;
- PWSTR publisher;
- PWSTR resourceId;
- PWSTR publisherId;
- } PACKAGE_ID;
- #define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)
- #define ARRAY_SIZEOF(array) (sizeof(array)/sizeof(array[0]))
- HICON GetUWPAppIcon(HWND hWnd, UINT uiIconSize = 32) {
- HICON hIcon = NULL;
- static LONG(WINAPI * pGetPackageFullName)(HANDLE, UINT32*, PWSTR);
- static LONG(WINAPI * pGetPackagePathByFullName)(PCWSTR, UINT32*, PWSTR);
- static LONG(WINAPI * pPackageIdFromFullName)(PCWSTR, const UINT32, UINT32*, BYTE*);
- if (!pGetPackageFullName)pGetPackageFullName = (LONG(WINAPI*)(HANDLE, UINT32*, PWSTR))
- GetProcAddress(GetModuleHandle(L"kernel32"), "GetPackageFullName");
- if (!pGetPackagePathByFullName)pGetPackagePathByFullName = (LONG(WINAPI*)(PCWSTR, UINT32*, PWSTR))
- GetProcAddress(GetModuleHandle(L"kernel32"), "GetPackagePathByFullName");
- if (!pPackageIdFromFullName)pPackageIdFromFullName = (LONG(WINAPI*)(PCWSTR, const UINT32, UINT32*, BYTE*))
- GetProcAddress(GetModuleHandle(L"kernel32"), "PackageIdFromFullName");
- if (pGetPackageFullName && pGetPackagePathByFullName && pPackageIdFromFullName)
- {
- WCHAR szPackageName[MAX_PATH];
- WCHAR szPackagePath[MAX_PATH];
- szPackageName[0] = L'\0';
- UINT32 uiPackageNameLength = MAX_PATH;
- UINT32 uiPackagePathLength = MAX_PATH;
- UINT32 uiPackageIdLength = 0;
- DWORD dwProcessId = 0;
- GetWindowThreadProcessId(hWnd, &dwProcessId);
- HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwProcessId);
- pGetPackageFullName(hProcess, &uiPackageNameLength, szPackageName);
- pGetPackagePathByFullName(szPackageName, &uiPackagePathLength, szPackagePath);
- pPackageIdFromFullName(szPackageName, 0, &uiPackageIdLength, NULL);
- BYTE* byPackageId = (BYTE*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, uiPackageIdLength);
- pPackageIdFromFullName(szPackageName, 0, &uiPackageIdLength, byPackageId);
- CloseHandle(hProcess);
- // if (OpenProcessDir(dwProcessId, szPackagePath))
- if (byPackageId)
- {
- if (szPackageName[0] != 0)
- {
- if (szPackagePath[lstrlen(szPackagePath) - 1] != '\\')lstrcat(szPackagePath, L"\\");
- lstrcat(szPackagePath, L"AppxManifest.xml");
- HANDLE hFile = CreateFile(szPackagePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
- if (hFile)
- {
- DWORD dwSize = GetFileSize(hFile, NULL);
- BYTE* utf8 = (BYTE*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize);
- ReadFile(hFile, utf8, dwSize, NULL, NULL);
- CloseHandle(hFile);
- WCHAR* szXML = (WCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize * 3);
- MultiByteToWideChar(CP_UTF8, 0, (LPCCH)utf8, dwSize, szXML, dwSize * 2);
- HeapFree(GetProcessHeap(), 0, utf8);
- WCHAR* sz44 = lstrstr(szXML, L"Square44x44Logo");
- WCHAR* szY = NULL;
- if (sz44)
- {
- szY = lstrstr(sz44, L"\"");
- if (szY)
- {
- WCHAR* szYY = lstrstr(&szY[1], L"\"");
- if (szYY)
- szYY[0] = L'\0';
- }
- }
- TCHAR szLogoPath[MAX_PATH];
- if (szY)
- {
- // WCHAR szName[MAX_PATH];
- // WCHAR* sz_ = wcsstr(szPackageName, L"_");
- // if(sz_)
- // wcsncpy_s(szName, MAX_PATH, szPackageName, sz_ - szPackageName);
- wsprintf(szLogoPath, L"@{%s?ms-resource://%s/Files/%s}", szPackageName, ((PACKAGE_ID*)byPackageId)->name, &szY[1]);
- for (int ii = 0, length = lstrlen(szLogoPath); ii < length; ii++)
- if (szLogoPath[ii] == '\\')szLogoPath[ii] = '/';
- pSHLoadIndirectString(szLogoPath, szLogoPath, MAX_PATH, 0);
- if (GetFileAttributes(szLogoPath) != 0xFFFFFFFF)
- {
- // ULONG_PTR ulToken;
- // Gdiplus::GdiplusStartupInput gdiplusStartupInput;
- // Gdiplus::GdiplusStartup(&ulToken, &gdiplusStartupInput, NULL);
- {
- Gdiplus::Bitmap bBitmapOrig(szLogoPath);
- Gdiplus::Bitmap bBitmap(uiIconSize, uiIconSize);
- Gdiplus::Graphics gGraphics(&bBitmap);
- gGraphics.DrawImage(&bBitmapOrig, 0, 0, uiIconSize, uiIconSize);
- HICON sIcon;
- bBitmap.GetHICON(&sIcon);
- if (sIcon)
- {
- hIcon = CopyIcon(sIcon);
- DestroyIcon(sIcon);
- }
- }
- // Gdiplus::GdiplusShutdown(ulToken);
- }
- }
- HeapFree(GetProcessHeap(), 0, szXML);
- }
- }
- HeapFree(GetProcessHeap(), 0, byPackageId);
- }
- }
- return hIcon;
- }
- HICON GetIcon(HWND hWnd, BOOL* bUWP, HWND* hUICoreWnd,int IconSize)
- {
- HICON hIcon = NULL;
- *bUWP = FALSE;
- if (hUICoreWnd)
- *hUICoreWnd = FALSE;
- if (hWnd == NULL /*|| IsHungAppWindow(hWnd)*/)return NULL;
- WCHAR szClassName[MAX_PATH];
- GetClassName(hWnd, szClassName, MAX_PATH);
- if (lstrcmp(szClassName, L"Windows.UI.Core.CoreWindow") == 0)
- {
- hIcon = GetUWPAppIcon(hWnd, IconSize);
- }
- if (hIcon == NULL && GetWindowLongPtr(hWnd, GWL_EXSTYLE) & (WS_EX_NOREDIRECTIONBITMAP))
- {
- HWND hUWP = FindWindowEx(hWnd, NULL, L"Windows.UI.Core.CoreWindow", NULL);
- if (hUWP)
- {
- if (hUICoreWnd)
- *hUICoreWnd = hUWP;
- hIcon = GetUWPAppIcon(hUWP, IconSize);
- }
- else
- {
- TCHAR szApplicationFrameWindowTitle[MAX_PATH] = { 0 };
- TCHAR szClassName[128] = { 0 };
- TCHAR szCoreWindowTitle[MAX_PATH] = { 0 };
- InternalGetWindowText(hWnd, szApplicationFrameWindowTitle, ARRAY_SIZEOF(szApplicationFrameWindowTitle));
- HWND hCurrent = GetTopWindow(NULL);
- do {
- if (!IsHungAppWindow(hCurrent) &&
- GetWindowLongPtr(hCurrent, GWLP_HWNDPARENT) == NULL &&
- GetWindowLongPtr(hCurrent, GWL_EXSTYLE) & (WS_EX_NOREDIRECTIONBITMAP) &&
- IsWindowEnabled(hCurrent)) {
- GetClassName(hCurrent, szClassName, ARRAY_SIZEOF(szClassName));
- if (lstrcmp(szClassName, L"Windows.UI.Core.CoreWindow") == 0) {
- InternalGetWindowText(hCurrent, szCoreWindowTitle, ARRAY_SIZEOF(szCoreWindowTitle));
- if (lstrstr(szApplicationFrameWindowTitle, szCoreWindowTitle))
- {
- if (hUICoreWnd)
- *hUICoreWnd = hCurrent;
- hIcon = GetUWPAppIcon(hCurrent, IconSize);
-
- break;
- }
- }
- }
- } while ((hCurrent = GetNextWindow(hCurrent, GW_HWNDNEXT)) != NULL);
- }
- }
- if (hIcon == NULL)
- {
- WCHAR szExe[MAX_PATH];
- GetFileNameFromWindowHandle(hWnd, szExe, MAX_PATH);
- SHFILEINFO shfi;
- pSHGetFileInfo(szExe, 0, &shfi, sizeof(shfi), SHGFI_ICON);
- hIcon = shfi.hIcon;
- }
- if (hIcon == NULL)
- {
- LRESULT dwResult = 1;
- dwResult = SendMessageTimeout(hWnd, WM_GETICON, ICON_BIG, 0, SMTO_ABORTIFHUNG, 300, (PDWORD_PTR)&hIcon);
- if (dwResult == 1)
- {
- if (hIcon == NULL)
- hIcon = (HICON)GetClassLongPtr(hWnd, GCLP_HICON);
- if (hIcon == NULL)
- hIcon = (HICON)SendMessage(hWnd, WM_GETICON, ICON_SMALL, 0);
- if (hIcon == NULL)
- hIcon = (HICON)GetClassLongPtr(hWnd, GCLP_HICONSM);
- if (hIcon == NULL)
- {
- WCHAR szExe[MAX_PATH];
- GetFileNameFromWindowHandle(hWnd, szExe, MAX_PATH);
- SHFILEINFO shfi;
- pSHGetFileInfo(szExe, 0, &shfi, sizeof(shfi), SHGFI_ICON);
- hIcon = shfi.hIcon;
- }
- }
-
- }
- else
- *bUWP = TRUE;
- /*
- Gdiplus::Bitmap gIcon(hIcon);
- Gdiplus::Bitmap bBitmap(IconSize, IconSize);
- Gdiplus::Graphics gGraphics(&bBitmap);
- gGraphics.SetInterpolationMode(InterpolationModeHighQuality);
- gGraphics.DrawImage(&gIcon, 0, 0, IconSize, IconSize);
- DestroyIcon(hIcon);
- bBitmap.GetHICON(&hIcon);
- */
- return hIcon;
- }
- BOOL SetForeground(HWND hWnd)
- {
- bool bResult = false;
- bool bHung = IsHungAppWindow(hWnd) != 0;
- DWORD dwCurrentThreadId = 0, dwTargetThreadId = 0;
- DWORD dwTimeout = 0;
-
- dwCurrentThreadId = GetCurrentThreadId();
- dwTargetThreadId = GetWindowThreadProcessId(hWnd, NULL);
-
- if (IsIconic(hWnd)) {
- // ShowWindow(hWnd,SW_RESTORE);
- SendMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
- }
-
- if (!bHung) {
- for (int i = 0; i < 10 && hWnd != GetForegroundWindow(); i++) {
- dwCurrentThreadId = GetCurrentThreadId();
- dwTargetThreadId = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
- AttachThreadInput(dwCurrentThreadId, dwTargetThreadId, true);
- SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
- BringWindowToTop(hWnd);
- AllowSetForegroundWindow(ASFW_ANY);
- bResult = SetForegroundWindow(hWnd) != 0;
- AttachThreadInput(dwCurrentThreadId, dwTargetThreadId, false);
- Sleep(10);
- }
- }
- else {
- BringWindowToTop(hWnd);
- bResult = SetForegroundWindow(hWnd) != 0;
- }
- return bResult;
- /*
- int tIdCur = GetWindowThreadProcessId(GetForegroundWindow(), NULL);//获取当前窗口句柄的线程ID
- int tIdCurProgram = GetWindowThreadProcessId(hWnd,NULL);//获取当前运行程序线程ID
- BOOL ret=AttachThreadInput(tIdCur, tIdCurProgram, 1);//是否能成功和当前自身进程所附加的输入上下文有关;
- SetForegroundWindow(hWnd);
- AttachThreadInput(tIdCur, tIdCurProgram, 0);
- return ret;
- */
- }
- void lstrlwr(WCHAR* wString, size_t SizeInWords)
- {
- for (size_t i = 0; i < SizeInWords; i++)
- {
- if ((wString[i] >= 'A') && (wString[i] <= 'Z'))
- wString[i] += ('a' - 'A');
- }
- }
-
- wchar_t* lstrstr(const wchar_t* str, const wchar_t* sub)
- {
- if (str == NULL || sub == NULL)
- return NULL;
- int iStrLen = lstrlen(str);
- int iSubLen = lstrlen(sub);
- if (iStrLen < iSubLen)
- return NULL;
- if (iStrLen != 0 && iSubLen == 0)
- return NULL;
- if (iStrLen == 0 && iSubLen == 0)
- {
- return (wchar_t*)str;
- }
- for (int i = 0; i < iStrLen; ++i)
- {
- int m = 0, n = i;
- if (lstrlen(str + i) < iSubLen)
- {
- return NULL;
- }
- if (str[n] == sub[m])
- {
- while (str[n++] == sub[m++])
- {
- if (sub[m] == L'\0')
- return (wchar_t*)str + i;
- }
- }
- }
- return NULL;
- }
- BOOL OpenProcessPath(DWORD dwProcessId)//通过进程ID打开进程的路径
- {
- BOOL ret = FALSE;
- WCHAR szExplorer[MAX_PATH] = L"/select,";
- WCHAR* sz;
- int iLen = lstrlen(szExplorer);
- sz = &szExplorer[iLen];
- if (GetProcessFileName(dwProcessId, sz, MAX_PATH))
- {
- WCHAR szExe[MAX_PATH];
- GetWindowsDirectory(szExe, MAX_PATH);
- lstrcat(szExe, L"\\explorer.exe ");
- lstrcat(szExe, szExplorer);
- ret = RunProcess((LPTSTR)1, szExe);
- }
- return ret;
- }
- BOOL OpenWindowPath(HWND hWnd)
- {
- BOOL ret = FALSE;
- DWORD dwProcessId;
- GetWindowThreadProcessId(hWnd, &dwProcessId);
- if (dwProcessId)
- ret = OpenProcessPath(dwProcessId);
- return ret;
- }
- HICON OpenProcessIcon(DWORD dProcessID, int cx)//通过进程ID ICON
- {
- HICON ret = NULL;
- WCHAR szExe[MAX_PATH];
- GetProcessFileName(dProcessID, szExe, MAX_PATH);
- SHFILEINFO shellInfo;
- pSHGetFileInfo(szExe, 0, &shellInfo, sizeof(shellInfo), SHGFI_ICON | SHGFI_SMALLICON);
- ret = shellInfo.hIcon;
- // ret = pExtractIcon(NULL, szExe, 0);;
- return ret;
- }
- HICON GetIconForCSIDL(int csidl)
- {
- LPITEMIDLIST pidl = 0;
- SHGetSpecialFolderLocation(NULL, csidl, &pidl);
- if (pidl)
- {
- SHFILEINFO shellInfo;
- pSHGetFileInfo(LPCTSTR(pidl), FILE_ATTRIBUTE_NORMAL, &shellInfo, sizeof(shellInfo), SHGFI_PIDL | SHGFI_ICON);
- IMalloc* pMalloc;
- SHGetMalloc(&pMalloc);
- if (pMalloc)
- {
- pMalloc->Free(pidl);
- pMalloc->Release();
- }
- return shellInfo.hIcon;
- }
- return 0;
- }
|