Почему не работает DestroyWindow ??
DestroyWindow(FindWindow("Untitled - Notepad"));
А он не закрывает окно блокнота.. FindWindow не возвращает 0 - это точно (проверял). И вообще, этим методом не одно окно не закрывается..
В чём моя ошибка?
(©MSDN)
A thread cannot use DestroyWindow to destroy a window created by a different thread
(©MSDN)
Окей.. А тогда какое сообщение закрывает чужое окно? Кроме WM_NCDESTROY и WM_DESTROY есть ещё сообщения, уничтожающие окна?
Окей.. А тогда какое сообщение закрывает чужое окно? Кроме WM_NCDESTROY и WM_DESTROY есть ещё сообщения, уничтожающие окна?
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
Вызываю
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;
}
PostMessage(hwndCalc, WM_CLOSE, 0, 0);
Господа, что-то вы тут, кажется, усложнили. Надо просто вызвать
PostMessage(hwndCalc, WM_CLOSE, 0, 0);
А откуда тогда узнать дискриптор hwndCalc?
А откуда тогда узнать дискриптор hwndCalc?
HWND hwndCalc = FindWindow("SciCalc", NULL);
HWND hwndCalc = FindWindow("SciCalc", NULL);
Разве WM_CLOSE не просто сворачивает окно?
Разве WM_CLOSE не просто сворачивает окно?
Специально сейчас проверил - послал WM_CLOSE окну калькулятора и, оп-ля-ля, оно закрылось.
HWND hwndCalc = FindWindow("SciCalc", NULL);
Да, действительно закрывает, здорово, а я столько всего написала...
Вопрос только такой, а откуда ты узнал, что имя класса SciCalc?
Да, действительно закрывает, здорово, а я столько всего написала...
Вопрос только такой, а откуда ты узнал, что имя класса SciCalc?
Читай выше, о WindowsScanner
...откуда ты узнал, что имя класса SciCalc?
Господа, в Visual Studio есть программа Spy++. Очень рекомендую. Она лежит в меню Tools специально для таких случаев.
Господа, в Visual Studio есть программа Spy++. Очень рекомендую. Она лежит в меню Tools специально для таких случаев.
Я всегда пользовался h=WindowFromPoint(p);:D
Я всегда пользовался h=WindowFromPoint(p);:D
Ваш юмор оценил.
HWND hwndCalc = FindWindow("SciCalc", NULL);
помнится мне, функция FindWindow может и по заголовку окна отрабатывать. так что знать имя класса окна вовсе не обязательно?
помнится мне, функция FindWindow может и по заголовку окна отрабатывать. так что знать имя класса окна вовсе не обязательно?
Имя класса знать желательно. Например, Вам известен заголовок окна калькулятора в немецкой версии Windows? а в корейской?