Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Почему не работает DestroyWindow ??

1.8K
26 февраля 2005 года
CoderDecoder
53 / / 22.10.2003
Вызываю
DestroyWindow(FindWindow("Untitled - Notepad"));

А он не закрывает окно блокнота.. FindWindow не возвращает 0 - это точно (проверял). И вообще, этим методом не одно окно не закрывается..
В чём моя ошибка?
430
26 февраля 2005 года
craftyfox
157 / / 20.02.2000
A thread cannot use DestroyWindow to destroy a window created by a different thread

(©MSDN)
1.8K
27 февраля 2005 года
CoderDecoder
53 / / 22.10.2003
Цитата:
Originally posted by craftyfox
A thread cannot use DestroyWindow to destroy a window created by a different thread

(©MSDN)



Окей.. А тогда какое сообщение закрывает чужое окно? Кроме WM_NCDESTROY и WM_DESTROY есть ещё сообщения, уничтожающие окна?

249
27 февраля 2005 года
DissDoc
639 / / 01.10.2004
Цитата:
Originally posted by CoderDecoder


Окей.. А тогда какое сообщение закрывает чужое окно? Кроме WM_NCDESTROY и WM_DESTROY есть ещё сообщения, уничтожающие окна?



 
Код:
HWND hCalc,hBtn;
 hCalc=FindWindow("SciCalc","Калькулятор");
 if(hCalc)
 {
  hBtn=FindWindowEx(hCalc,NULL,"Button","9");
  if(hBtn)SendMessage(hBtn,BM_CLICK,0,0);
 }

Нажимаем кнопку в калькуляторе. Запущенном. Откуда я знаю ClassName окна и кнопки? Программа WindowScaner, любезно предоставленная InqSoft. Можно еще EnumWindows использовать.

P.S.> Скажи скасибо Lord'y Kelviny
7.9K
01 марта 2005 года
kima
11 / / 18.11.2004
Цитата:
Originally posted by CoderDecoder
Вызываю
DestroyWindow(FindWindow("Untitled - Notepad"));

А он не закрывает окно блокнота.. FindWindow не возвращает 0 - это точно (проверял). И вообще, этим методом не одно окно не закрывается..
В чём моя ошибка?



Для того чтоб закрыть из своей программы чужую используй ф-цию
BOOL TerminateProcess(HANDLE hProcess,
UINT fuExitCode);
А закрытие именно блокнота будет выглядеть так:

HANDLE shot;

//делаем снимок активных процессов в системе при помощи
//функции CreateToolhelp32Snapshot, задав в первом параметре
//этой функции флаг TH32CS_SNAPPROCESS, тем самым показав ей,
//что нам нужны только процессы
shot= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (shot == NULL)
{
//в случае неудачи функции CreateToolhelp32Snapshot
//выведем сообщение об ошибке
MessageBox("Ошибочка вышла !!!");
}

//объявляем структуру PROCESSENTRY32, в которую будем заносить
//сведения об активных процессах
PROCESSENTRY32 pr;
int index = 0;

//при помощи функции Process32First заносим в pr сведения о
//первом в снимке активном процессе
if (Process32First(shot, &pr))
{
//если такового не существует, (а такого в природе не
//бывает, т.к. хотя бы процесс этого приложения должен
//быть в снимке), мы не заходим в данный if.

if(strcmp(pr.szExeFile, "notepad.exe") == 0)
{
//вызываю ф-цию удаления калькулятора
DelNotepad(pr);
}

else
{
//переходим к следуюцему процессу в снимке
//до тея пор, пока не дойдем до конца снимка
while (Process32Next(shot, &pr))
{
if(strcmp(pr.szExeFile, "notepad.exe") == 0)
{
//вызываю ф-цию удаления калькулятора
DelNotepad(pr);
}
}

}
}

для использования ф-ций по работе с процессами надо обязательно подключить библиотеку tlhelp32.h

ф-ция DelNotepad(pr) описана вот как: void DelNotepad(PROCESSENTRY32);
ee содержимое, где как раз и удаляем процесс:
void DelNotepad(PROCESSENTRY32 pr)
{
CString str;

//открываем объект ядра "процесс" с идентификатором,
//равным полученному ранее
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pr.th32ProcessID);
if(handle==NULL)
{
//если не получили описатель объекта ядра "процесс",
//узнаем почему
str.Format("%u",GetLastError());
MessageBox("Ошибка при открытии №"+str);
}

UINT fuExitCode = 0;
//если получили описатель, удаляем его побыстрее!
if(!TerminateProcess(handle, fuExitCode))
{
//если почему-то не удаляется
str.Format("%u",GetLastError());
MessageBox("Ошибка при удаленни №"+str);
}
else
{
str.Format("%u",fuExitCode);
MessageBox("Процесс удален с кодом выхода = "+str);
}
//удаляем описатель (кому он теперь нужен!?)
CloseHandle(handle);

return;
}

425
15 марта 2005 года
sq_deep
498 / / 18.02.2005
Господа, что-то вы тут, кажется, усложнили. Надо просто вызвать
PostMessage(hwndCalc, WM_CLOSE, 0, 0);
7.9K
17 марта 2005 года
kima
11 / / 18.11.2004
Цитата:
Originally posted by sq_deep
Господа, что-то вы тут, кажется, усложнили. Надо просто вызвать
PostMessage(hwndCalc, WM_CLOSE, 0, 0);



А откуда тогда узнать дискриптор hwndCalc?

425
17 марта 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by kima
А откуда тогда узнать дискриптор hwndCalc?

HWND hwndCalc = FindWindow("SciCalc", NULL);

1.7K
18 марта 2005 года
Envel
206 / / 29.11.2004
Цитата:
Originally posted by sq_deep
HWND hwndCalc = FindWindow("SciCalc", NULL);


Разве WM_CLOSE не просто сворачивает окно?

301
18 марта 2005 года
lord Kelvin
897 / / 08.11.2004
Цитата:
Originally posted by Envel

Разве WM_CLOSE не просто сворачивает окно?


Специально сейчас проверил - послал WM_CLOSE окну калькулятора и, оп-ля-ля, оно закрылось.

7.9K
18 марта 2005 года
kima
11 / / 18.11.2004
Цитата:
Originally posted by sq_deep
HWND hwndCalc = FindWindow("SciCalc", NULL);



Да, действительно закрывает, здорово, а я столько всего написала...
Вопрос только такой, а откуда ты узнал, что имя класса SciCalc?

1.7K
18 марта 2005 года
Envel
206 / / 29.11.2004
Цитата:
Originally posted by kima


Да, действительно закрывает, здорово, а я столько всего написала...
Вопрос только такой, а откуда ты узнал, что имя класса SciCalc?


Читай выше, о WindowsScanner

425
21 марта 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by kima

...откуда ты узнал, что имя класса SciCalc?

Господа, в Visual Studio есть программа Spy++. Очень рекомендую. Она лежит в меню Tools специально для таких случаев.

9.3K
27 марта 2005 года
maxrus
12 / / 28.02.2005
Цитата:
Originally posted by sq_deep
Господа, в Visual Studio есть программа Spy++. Очень рекомендую. Она лежит в меню Tools специально для таких случаев.


Я всегда пользовался h=WindowFromPoint(p);:D

425
28 марта 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by maxrus
Я всегда пользовался h=WindowFromPoint(p);:D

Ваш юмор оценил.

2
28 марта 2005 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by sq_deep
HWND hwndCalc = FindWindow("SciCalc", NULL);


помнится мне, функция FindWindow может и по заголовку окна отрабатывать. так что знать имя класса окна вовсе не обязательно?

425
28 марта 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by squirL
помнится мне, функция FindWindow может и по заголовку окна отрабатывать. так что знать имя класса окна вовсе не обязательно?


Имя класса знать желательно. Например, Вам известен заголовок окна калькулятора в немецкой версии Windows? а в корейской?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог