【问题标题】:Restore a Minimized Windows Mobile Application Form from c++从 C++ 还原最小化的 Windows Mobile 应用程序窗体
【发布时间】:2011-07-15 06:40:03
【问题描述】:

我有一个紧凑的 .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 应用程序的正确窗口句柄?

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    您试图在进程句柄上使用 ShowWindow,而不是窗口句柄,这是无效的。您将需要主应用程序窗口的句柄,您可以通过 FindWindow 调用获得,但这是一个杂项。

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

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

    解决方案的第二部分是让您的托管应用启动一个线程(或计时器)以定期检查命名系统事件。如果发现设置了事件,则将主窗体最大化并将其置于最前面。

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

    【讨论】:

      猜你喜欢
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      相关资源
      最近更新 更多