#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\"\?>\\%strue%s%sIgnoreNewfalsefalsefalsetruefalsePT10MPT1Htruefalsetruetruefalse";
const WCHAR szXML2[] = L"falsetruePT0S7%st";
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"HighestAvailableBuiltin\\Administrators");
// 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"%s", szUserName);
WCHAR szUserID[128];
wsprintf(szUserID, L"%sInteractiveToken", 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;
}