从c ++还原最小化的Windows Mobile应用程序表单

时间:2011-03-14 19:29:50

标签: c# visual-c++ windows-mobile

我有一个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?

先谢谢。

1 个答案:

答案 0 :(得分:1)

您尝试在进程句柄上使用ShowWindow,而不是Window句柄,这是无效的。您需要使用FindWindow调用获得的主应用程序窗口的句柄,但它是一个kludge。

这里更好的方法是两部分解决方案。

首先使用命名的互斥锁。在托管应用程序启动时创建互斥锁,并在退出时释放它。然后,C应用程序可以检查互斥锁是否存在以确定应用程序是否正在运行 - 无需工具帮助。

解决方案的第二部分是让您的托管应用启动线程(或计时器)以定期检查命名的系统事件。如果它发现事件已设置,那么它会最大化主窗体并将其拉出来。

回到C应用程序,如果发现互斥锁存在(应用程序正在运行),那么您只需设置事件并退出。这将触发manged app中的线程,使自己脱颖而出。