Восстановите свернутую форму приложения Windows Mobile из c ++ - PullRequest
0 голосов
/ 14 марта 2011

У меня есть приложение Compact .Net 2.0 (для Windows Mobile 2003 и выше), в котором есть кнопка «Свернуть форму».Я использую P / Invoke, чтобы свернуть форму / приложение

//[DllImport("coredll.dll")]
ShowWindow(this.Handle /* Handle for the Form */, SW_MINIMIZED /*6*/)

У меня есть еще одна простая программа Splash.exe, написанная на C ++, которая запускает приложение compact.net.Цель программы Splash - проверить, запущено ли приложение .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?

Заранее спасибо.

1 Ответ

1 голос
/ 14 марта 2011

Вы пытаетесь использовать ShowWindow для дескриптора процесса, а не дескриптора Window, что недопустимо. Вам понадобится дескриптор вашего главного окна приложения, которое вы можете получить с помощью вызовов FindWindow, но это клудж.

Лучший подход здесь - решение из 2 частей.

Сначала используйте именованный мьютекс. Создайте мьютекс при запуске управляемого приложения и отпустите его при выходе. Затем приложение C может просто проверить, существует ли мьютекс, чтобы определить, запущено ли приложение или нет - работа с инструментами не требуется.

Вторая часть решения заключается в том, чтобы ваше управляемое приложение запускало поток (или таймер) для периодической проверки именованного системного события. Если он находит, что событие установлено, он максимизирует основную форму и выводит его на передний план.

Вернувшись в приложение C, если обнаружен мьютекс (приложение работает), тогда вы просто устанавливаете событие и выходите. Это приведет к тому, что поток в управляемом приложении выйдет на передний план.

...