[英]Restore a Minimized Windows Mobile Application Form from c++
我有一個緊湊的.Net 2.0應用程序(針對Windows Mobile 2003及更高版本),該應用程序具有一個按鈕以最小化窗體。 我使用P / Invoke最小化表單/應用程序
//[DllImport("coredll.dll")]
ShowWindow(this.Handle /* Handle for the Form */, SW_MINIMIZED /*6*/)
我有另一個用C ++編寫的簡單程序Splash.exe,可以啟動compact.net應用程序。 Splash程序的目的是檢查.Net應用程序是否正在運行,如果正在運行,請還原.Net窗體,否則請啟動.Net應用程序。
我使用以下過程檢查.Net應用程序是否正在運行:
HWND GetProcessIfAlive(TCHAR szExeName[MAX_PATH]) /* Exe name of the .Net App */
{
HANDLE hSnapShot = NULL;
PROCESSENTRY32 pEntry = {0};
// Get the snapshot of the system
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
pEntry.dwSize = sizeof(pEntry);
//Get first process
Process32First(hSnapShot, &pEntry);
//Iterate thru all processes
while(TRUE)
{
TCHAR *strTempExe = pEntry.szExeFile;
if(_tcscmp(strTempExe, szExeName) == 0)
{
DWORD ProcesID = pEntry.th32ProcessID;
return (HWND)OpenProcess (PROCESS_ALL_ACCESS, FALSE, ProcesID);
//return (HWND)ProcesID;
}
if(!Process32Next (hSnapShot, &pEntry)/* == FALSE*/)
{
return NULL;
}
}
return NULL;
}
從此過程返回后,我嘗試使用
HWND hExistingHandle = GetProcessIfAlive(TEXT("CompactDotNetApp.exe"));
if(hExistingHandle != NULL)
{
if(ShowWindow(hExistingHandle, SW_RESTORE) == FALSE)
{
DWORD err = GetLastError();
}
}
我收到錯誤1400 ERROR_INVALID_WINDOW_HANDLE
如何為正在運行的Compact .Net應用程序獲取正確的窗口Handle來修復代碼?
提前致謝。
您正在嘗試在無效的進程句柄(而不是Window句柄)上使用ShowWindow。 您將需要主應用程序窗口的句柄,可以通過FindWindow調用獲得該句柄,但這很麻煩。
更好的方法是分兩部分進行解決。
首先使用一個命名的互斥鎖。 在托管應用啟動時創建互斥鎖,在退出時釋放互斥鎖。 然后,C應用程序可以僅檢查互斥對象是否存在以確定該應用程序是否正在運行-無需任何工具幫助工作。
解決方案的第二部分是讓托管應用啟動線程(或計時器)以定期檢查命名的系統事件。 如果發現事件已設置,則它將最大化主窗體並將其置於前列。
回到C應用程序中,如果發現互斥對象存在(該應用程序正在運行),則只需設置事件並退出。 這將觸發托管應用程序中的線程,使其脫穎而出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.