我有一个Compact .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 Application?
先谢谢。
答案 0 :(得分:1)
您尝试在进程句柄上使用ShowWindow,而不是Window句柄,这是无效的。您需要使用FindWindow调用获得的主应用程序窗口的句柄,但它是一个kludge。
这里更好的方法是两部分解决方案。
首先使用命名的互斥锁。在托管应用程序启动时创建互斥锁,并在退出时释放它。然后,C应用程序可以检查互斥锁是否存在以确定应用程序是否正在运行 - 无需工具帮助。
解决方案的第二部分是让您的托管应用启动线程(或计时器)以定期检查命名的系统事件。如果它发现事件已设置,那么它会最大化主窗体并将其拉出来。
回到C应用程序,如果发现互斥锁存在(应用程序正在运行),那么您只需设置事件并退出。这将触发manged app中的线程,使自己脱颖而出。