Почему я не могу закрыть дескриптор окна в моем коде? - PullRequest
6 голосов
/ 14 декабря 2011

У меня есть эти две строки в моей главной, но я не могу закрыть ручку в конце. Я пытаюсь получить ручку к Windows Mine плачет и закрыть его после этого, но это не работает. И у меня есть все необходимые включения, которые мне нужны.

#include <windows.h>
#include <stdio.h>

в основном

HWND wh = FindWindow("Minesweeper", "Minesweeper");
CloseHandle (wh);

На printf из wh я вижу, что значение идентично этому, полученному в spy ++.

И я получаю ошибку

"Адрес исключения: 0x7c90e4ff"

Чего мне не хватает?

КСТАТИ: Закрывающий дескриптор процесса работает нормально, если я изменяю две строки выше.

Ответы [ 3 ]

14 голосов
/ 14 декабря 2011

Здесь есть пара основных проблем.Прежде всего, вы не звоните CloseHandle с дескриптором окна.Это не такая ручка.Вы используете CloseHandle, когда у вас есть HANDLE, но HWND не является HANDLE.Если вы хотите уничтожить дескриптор окна, вам нужно вызвать DestroyWindow.

Однако документация для DestroyWindow гласит:

Поток не можетиспользуйте DestroyWindow, чтобы уничтожить окно, созданное другим потоком.

Так что вы также не можете сделать это.

Что вы можете сделать, это отправить сообщение WM_CLOSE наокно.Этого должно быть достаточно, чтобы убедительно закрыть его.

Обратите внимание, что WM_CLOSE отправлено, а не отправлено.Это можно определить по этой строке из документации :

Окно получает это сообщение через функцию WindowProc.

Update

Джон Кноллер отмечает, что я неправильно истолковываю документацию по Windows, которая не была написана для освещения ситуации, когда одно приложение пытается закрыть другое приложение.

Совет Джона:

На самом деле разумнее отправить WM_CLOSE другому процессу, используя PostMessage или SendNotifyMessage.Если вы используете SendMessage, вы застрянете, если процесс не качает сообщения.Еще лучше использовать WM_SYSCOMMAND / SCCLOSE, что по сути аналогично нажатию кнопки закрытия заголовка окна.

6 голосов
/ 14 декабря 2011

Не использовать CloseHandle, CloseWindow или DestroyWindow.Отправьте в окно сообщение WM_CLOSE, используя SendMessage.

4 голосов
/ 14 декабря 2011

Дескрипторы Windows (HWND) не являются системными дескрипторами (HANDLE). CloseHandle () для системных объектов.

Рассмотрим PostMessage( wh, WM_CLOSE, 0, 0 );, поскольку эта статья описывает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...