используя sendmessage для отправки wm_close другому процессу - PullRequest
3 голосов
/ 23 марта 2011

Я хочу отправить wm_close другому процессу, с помощью которого я хочу благополучно завершить этот процесс.

int _tmain(int argc, _TCHAR* argv[])
{

    DWORD SetOfPID;
    SetOfPID = GetProcId(_T("abc.exe"));  //this will return pid
    HANDLE h = OpenProcess(PROCESS_ALL_ACCESS,false, SetOfPID);

    HWND hwnd = ::GetTopWindow(NULL);
    while(hwnd)
    {
        DWORD pid;
        DWORD dwThreadId = ::GetWindowThreadProcessId(hwnd, &pid);
         if(pid == SetOfPID)
         {    
              break;
         }
         hwnd = ::GetNextWindow(hwnd, GW_HWNDNEXT);
    }
    //DestroyWindow(hwnd);
    bool temp = IsWindow(hwnd); **//this gives true**
    LRESULT res = ::SendMessage(hwnd, WM_CLOSE, NULL, NULL);
    DWORD err = GetLastError(); **//this gives 6**
    CloseHandle(hwnd);
    CloseHandle(h);
    return 0;
}

этот фрагмент кода выглядит хорошо, но целевой процесс не завершается, кто-нибудь может мне помочь?

Ответы [ 3 ]

2 голосов
/ 11 января 2012

Я бы попытался закрыть окно (процессы с) в следующем порядке:

  1. WM_CLOSE

  2. WM_QUIT

  3. WM_DESTROY

  4. TerminateProcess ().

Просто мой дубль, как яЯ обрабатываю (отключаю) WM_CLOSE для окна и испытываю затруднения при различении сообщений пользователя о закрытии и сообщения о закрытии, отправленных другой главной задачей.WM_QUIT, кажется, решил мою проблему без использования собственного WM_APP_CLOSE моего собственного.TerminateProcess - это в крайнем случае нечистый выход, которого следует избегать любой ценой (он может оставить дескрипторы (например, COM и т. Д.) И память и т. Д. Не освобожденными).

2 голосов
/ 23 марта 2011

Вы уверены, что окно, которое вы находите, является правильным? Вы можете легко проверить с помощью Spy ++. Более того, при поиске окна я думаю, что лучше использовать EnumWindows. Я не уверен, что ваш метод правильный.

0 голосов
/ 23 марта 2011

Если приложение не обрабатывает WM_CLOSE, DefWindowProc должен обработать это (путем изящного закрытия приложения), однако, если приложение обрабатывает WM_CLOSE, то оно может просто проигнорировать его. Попробуйте вместо этого отправить сообщения WM_DESTROY и WM_NCDESTROY.

...