📄 winutil.cpp
字号:
if(strURL.GetLength() == 0) return;
if(strURL.Left(6) == _T("cmd://"))
OpenUrlProcess(strURL.Right(strURL.GetLength() - 6), hParent);
else // Standard method
WU_SysShellExecute(strURL, NULL, hParent);
}
// Internal function
void OpenUrlProcess(LPCTSTR lpURL, HWND hParent)
{
ASSERT(lpURL != NULL); if(lpURL == NULL) return;
CString strLine = lpURL, strFile, strParam;
BOOL bFile = FALSE, bParam = FALSE;
if(strLine.Left(1) == _T("\""))
{
int nSecond = strLine.Find(_T('\"'), 1);
if(nSecond >= 1)
{
strFile = strLine.Mid(1, nSecond - 1).Trim();
bFile = TRUE;
strParam = strLine.Right(strLine.GetLength() - (nSecond + 1)).Trim();
bParam = TRUE;
}
}
if(bFile == FALSE)
{
int nSpace = strLine.Find(_T(' '));
if(nSpace >= 0)
{
strFile = strLine.Left(nSpace);
bFile = TRUE;
strParam = strLine.Right(strLine.GetLength() - nSpace).Trim();
bParam = TRUE;
}
else { strFile = strLine; bFile = TRUE; }
}
if((bParam == TRUE) && (strParam.GetLength() > 0))
WU_SysShellExecute(strFile, strParam, hParent);
else
WU_SysShellExecute(strFile, NULL, hParent);
}
void WU_SysShellExecute(LPCTSTR lpFile, LPCTSTR lpParameters, HWND hParent)
{
ASSERT(lpFile != NULL); if(lpFile == NULL) return;
ASSERT(lpFile[0] != 0); if(lpFile[0] == 0) return;
SHELLEXECUTEINFO sei;
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.fMask = SEE_MASK_FLAG_NO_UI;
sei.hwnd = hParent;
sei.lpFile = lpFile;
sei.lpParameters = lpParameters;
sei.nShow = SW_SHOWNORMAL;
const DWORD dwDummyErr = 0x19B5A28F;
const DWORD dwPrevErr = GetLastError();
SetLastError(dwDummyErr);
if(ShellExecuteEx(&sei) == FALSE)
{
const DWORD dwErr = GetLastError();
if(dwErr == dwDummyErr) { SetLastError(dwPrevErr); return; }
std::basic_string<TCHAR> strErr = WU_FormatSystemMessage(dwErr);
if(strErr.size() == 0) { SetLastError(dwPrevErr); return; }
CString strMsg = TRL("&File");
RemoveAcceleratorTip(&strMsg);
strMsg += _T(": ");
strMsg += lpFile;
if(lpParameters != NULL)
{
strMsg += _T("\r\n");
strMsg += TRL("Arguments");
strMsg += _T(": ");
strMsg += lpParameters;
}
strMsg += _T("\r\n\r\n");
strMsg += strErr.c_str();
MessageBox(hParent, strMsg, TRL("Password Safe"), MB_ICONWARNING | MB_OK);
}
SetLastError(dwPrevErr);
}
BOOL _FileAccessible(LPCTSTR lpFile)
{
FILE *fp = NULL;
_tfopen_s(&fp, lpFile, _T("rb"));
if(fp == NULL) return FALSE;
fclose(fp); fp = NULL;
return TRUE;
}
BOOL _FileWritable(LPCTSTR lpFile)
{
FILE *fp = NULL;
_tfopen_s(&fp, lpFile, _T("ab"));
if(fp == NULL) return FALSE;
fclose(fp); fp = NULL;
return TRUE;
}
C_FN_SHARE int _OpenLocalFile(LPCTSTR szFile, int nMode)
{
// TCHAR szPath[1024];
// TCHAR szFileTempl[1024];
int nRet = 0;
// GetModuleFileName(NULL, szFileTempl, MAX_PATH + 32);
// _GetPathFromFile(szFileTempl, szPath);
// _tcscpy_s(szFileTempl, _countof(szFileTempl), szPath);
// _tcscat_s(szFileTempl, _countof(szFileTempl), _T("\\"));
std_string strPath = Executable::instance().getPathOnly();
// _tcscat_s(szFileTempl, _countof(szFileTempl), szFile);
std_string strFile = strPath;
strFile += szFile;
#ifndef _WIN32_WCE
LPCTSTR lpVerb = _T("open");
if(nMode == OLF_OPEN) { } // Default == OLF_OPEN
else if(nMode == OLF_PRINT) lpVerb = _T("print");
else if(nMode == OLF_EXPLORE) lpVerb = _T("explore");
else { ASSERT(FALSE); }
nRet = (int)(INT_PTR)ShellExecute(::GetActiveWindow(), lpVerb,
strFile.c_str(), NULL, strPath.c_str(), KPSW_SHOWDEFAULT);
#else
ASSERT(FALSE); // Implement before using on WinCE
#endif
return nRet;
}
BOOL WU_GetFileNameSz(BOOL bOpenMode, LPCTSTR lpSuffix, LPTSTR lpStoreBuf, DWORD dwBufLen)
{
DWORD dwFlags;
CString strSample;
CString strFilter;
ASSERT(lpSuffix != NULL); if(lpSuffix == NULL) return FALSE;
ASSERT(lpStoreBuf != NULL); if(lpStoreBuf == NULL) return FALSE;
ASSERT(dwBufLen != 0); if(dwBufLen == 0) return FALSE;
strSample = _T("*.");
strSample += lpSuffix;
strFilter = TRL("All Files");
strFilter += _T(" (*.*)|*.*||");
if(bOpenMode == FALSE)
{
dwFlags = OFN_LONGNAMES | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
dwFlags |= OFN_EXTENSIONDIFFERENT;
// OFN_EXPLORER = 0x00080000, OFN_ENABLESIZING = 0x00800000
dwFlags |= 0x00080000 | 0x00800000 | OFN_NOREADONLYRETURN;
}
else
{
dwFlags = OFN_LONGNAMES | OFN_EXTENSIONDIFFERENT;
// OFN_EXPLORER = 0x00080000, OFN_ENABLESIZING = 0x00800000
dwFlags |= 0x00080000 | 0x00800000;
dwFlags |= OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
}
CFileDialog dlg(bOpenMode, lpSuffix, strSample, dwFlags, strFilter, NULL);
if(dlg.DoModal() == IDOK)
{
strSample = dlg.GetPathName();
if((DWORD)strSample.GetLength() < dwBufLen)
{
_tcscpy_s(lpStoreBuf, dwBufLen, (LPCTSTR)strSample);
return TRUE;
}
else _tcsncpy_s(lpStoreBuf, dwBufLen, (LPCTSTR)strSample, dwBufLen - 1);
}
return FALSE;
}
BOOL WU_OpenAppHelp(LPCTSTR lpTopicFile)
{
ASSERT(lpTopicFile != NULL); if(lpTopicFile == NULL) return FALSE;
TCHAR tszBuf[MAX_PATH * 2];
GetApplicationDirectory(tszBuf, MAX_PATH * 2 - 2, TRUE, TRUE);
CString str = _T("hh.exe ms-its:");
str += tszBuf;
str += _T("/");
str += PWM_README_FILE;
str += _T("::/");
str += lpTopicFile;
TWinExec(str, KPSW_SHOWDEFAULT);
return TRUE;
}
UINT TWinExec(LPCTSTR lpCmdLine, WORD wCmdShow)
{
STARTUPINFO sui;
PROCESS_INFORMATION pi;
BOOL bResult;
ASSERT(lpCmdLine != NULL);
if(lpCmdLine == NULL) return ERROR_PATH_NOT_FOUND;
ZeroMemory(&sui, sizeof(STARTUPINFO));
sui.cb = sizeof(STARTUPINFO);
sui.wShowWindow = wCmdShow;
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
const size_t dwCmdLen = _tcslen(lpCmdLine);
LPTSTR lp = new TCHAR[dwCmdLen + 2];
_tcscpy_s(lp, dwCmdLen + 2, lpCmdLine);
bResult = CreateProcess(NULL, lp, NULL, NULL, FALSE, 0, NULL, NULL, &sui, &pi);
// LPVOID lpMsgBuf;
// FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);
// MessageBox(NULL, (LPCTSTR)lpMsgBuf, _T("Error"), MB_OK | MB_ICONINFORMATION);
// LocalFree(lpMsgBuf);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
SAFE_DELETE_ARRAY(lp);
return (bResult != FALSE) ? 32 : ERROR_FILE_NOT_FOUND;
}
BOOL WU_IsWin9xSystem()
{
OSVERSIONINFO osvi;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
return ((osvi.dwMajorVersion <= 4) ? TRUE : FALSE);
}
BOOL WU_SupportsMultiLineTooltips()
{
OSVERSIONINFO osvi;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
return (((osvi.dwMajorVersion >= 5) && (osvi.dwMinorVersion >= 1)) ?
TRUE : FALSE);
}
std::basic_string<TCHAR> WU_GetTempFile()
{
TCHAR szDir[MAX_PATH * 2];
GetTempPath(MAX_PATH * 2 - 2, szDir);
if(szDir[_tcslen(szDir) - 1] != _T('\\'))
_tcscat_s(szDir, _countof(szDir), _T("\\"));
std::basic_string<TCHAR> tszFile;
DWORD dwIndex = 0;
while(true)
{
dwIndex += 13;
DWORD dwTest = ((DWORD)rand() << 16) + (DWORD)rand() + dwIndex;
CString strTest;
strTest.Format(_T("%s%s%u%s"), szDir, _T("Tmp"), dwTest, _T(".html"));
if(_FileAccessible(strTest) == TRUE) continue;
if(_FileWritable(strTest) == FALSE) continue;
DeleteFile(strTest);
tszFile = (LPCTSTR)strTest;
break;
}
return tszFile;
}
std::basic_string<TCHAR> WU_GetUserName()
{
std::basic_string<TCHAR> tsz;
LPTSTR lpUser = new TCHAR[WU_MAX_USER_LEN + 1];
memset(lpUser, 0, (WU_MAX_USER_LEN + 1) * sizeof(TCHAR));
DWORD dwUserLength = WU_MAX_USER_LEN;
GetUserName(lpUser, &dwUserLength);
tsz += lpUser;
SAFE_DELETE_ARRAY(lpUser);
if(tsz.size() > 0) tsz += _T(" @ ");
LPTSTR lpMachine = new TCHAR[WU_MAX_MACHINE_LEN + 1];
memset(lpMachine, 0, (WU_MAX_MACHINE_LEN + 1) * sizeof(TCHAR));
DWORD dwMachineLength = WU_MAX_MACHINE_LEN;
GetComputerName(lpMachine, &dwMachineLength);
tsz += lpMachine;
SAFE_DELETE_ARRAY(lpMachine);
return tsz;
}
/*
// Warning: this function is NOT multithreading-safe!
BOOL ContainsChildWindow(HWND hWndContainer, LPCTSTR lpChildWindowText)
{
ASSERT(lpChildWindowText != NULL);
if(lpChildWindowText == NULL) return FALSE;
ASSERT(lpChildWindowText[0] != 0);
if(lpChildWindowText[0] == 0) return FALSE;
g_lpChildWindowText = lpChildWindowText;
BOOL bWindowFound = FALSE;
EnumChildWindows(hWndContainer, CcwEnumChildProc, (LPARAM)&bWindowFound);
return bWindowFound;
}
BOOL CALLBACK CcwEnumChildProc(HWND hWnd, LPARAM lParam)
{
// int nLength = GetWindowTextLength(hWnd);
// if(nLength <= 0) return TRUE; // Continue enumeration
int nLength = _tcslen(g_lpChildWindowText);
int nAllocated = nLength + 4;
LPTSTR lpText = new TCHAR[nAllocated];
memset(lpText, 0, nAllocated * sizeof(TCHAR));
GetWindowText(hWnd, lpText, nAllocated - 2);
if(_tcsstr(lpText, g_lpChildWindowText) != NULL)
{
*((BOOL *)lParam) = TRUE;
SAFE_DELETE_ARRAY(lpText);
return FALSE; // Stop enumeration
}
SAFE_DELETE_ARRAY(lpText);
return TRUE; // Continue enumeration
}
*/
void SafeActivateNextWindow(HWND hWndBase)
{
HWND hWnd = GetWindow(hWndBase, GW_HWNDNEXT);
WINDOWPLACEMENT wp;
wp.length = sizeof(WINDOWPLACEMENT);
while(1)
{
if(hWnd != hWndBase)
{
LONG lStyle = GetWindowLong(hWnd, GWL_STYLE);
GetWindowPlacement(hWnd, &wp);
if(((lStyle & WS_VISIBLE) == WS_VISIBLE) && (wp.showCmd != SW_SHOWMINIMIZED))
{
if(GetWindowTextLength(hWnd) != 0) break;
}
}
hWnd = GetWindow(hWnd, GW_HWNDNEXT);
if(hWnd == NULL) break;
}
SetWindowPos(hWndBase, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
if(hWnd != NULL)
{
SetForegroundWindow(hWnd);
DWORD dwStartTime = timeGetTime();
while(1)
{
if(GetForegroundWindow() == hWnd) break;
if((timeGetTime() - dwStartTime) > 1000) break;
Sleep(50);
}
}
}
HWND WU_ShowWindowInTaskbar(HWND hWndShow, HWND hParent, BOOL bShow)
{
LONG_PTR sty;
if(bShow == FALSE) // Hide
{
sty = GetWindowLongPtr(hWndShow, GWL_EXSTYLE);
SetWindowLongPtr(hWndShow, GWL_EXSTYLE, sty & ~(WS_EX_APPWINDOW));
sty = GetWindowLongPtr(hWndShow, GWL_STYLE);
SetWindowLongPtr(hWndShow, GWL_STYLE, (sty | WS_CHILD) & ~(WS_POPUP));
return SetParent(hWndShow, hParent);
}
else // Show
{
HWND h = SetParent(hWndShow, NULL);
sty = GetWindowLongPtr(hWndShow, GWL_STYLE);
SetWindowLongPtr(hWndShow, GWL_STYLE, (sty | WS_POPUP) & ~(WS_CHILD));
sty = GetWindowLongPtr(hWndShow, GWL_EXSTYLE);
SetWindowLongPtr(hWndShow, GWL_EXSTYLE, sty | WS_EX_APPWINDOW);
return h;
}
}
std::basic_string<TCHAR> WU_FormatSystemMessage(DWORD dwLastErrorCode)
{
std::basic_string<TCHAR> str;
LPTSTR lpBuffer = NULL;
if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, dwLastErrorCode, 0, (LPTSTR)&lpBuffer, 1, NULL) != 0)
{
str = lpBuffer;
}
if(lpBuffer != NULL) { LocalFree(lpBuffer); lpBuffer = NULL; }
return str;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -