Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Закрыть приложение


Автор: Папараццы 23.10.2007, 13:12
Мне надо уничтожить процесс со своей программы.. То есть закрыть другую программу.  Не получается закрыть программу с использованием 
TerminateProcess(00000C2C, 0); 
Где 00000С2С это наш процесс айди.
Ошибка: E2121 Function call missing)
Также через SendMessage(00000C2C , WM_DESTROY, 0, 0);
Таже ошибка. Что делать ?? В чем ошибка.. 

Автор: dumb 23.10.2007, 13:44
Цитата(Папараццы @  23.10.2007,  14:12 Найти цитируемый пост)
Что делать ?
ознакомиться с форматом записи чисел, как минимум. 0x00000C2C.
далее - ты что в одну, что в другую функцию суешь pid процесса, в то время как первой нужен хэндл процесса(получаемый из OpenProcess), а второй - хэндл окна(FindWindow/EnumWindows/etc).

за примерами - фпоиск по слову TerminateProcess или WM_CLOSE.

Автор: Папараццы 23.10.2007, 14:51
Процесс ID постоянно меняется..  Как найти программу если незнаем не пид не хендл ? 

Автор: Папараццы 23.10.2007, 15:14
При 
Код

SendMessage(0x00000CC4, WM_DESTROY, 0, 0);


Can not convert 'int' to 'void*'

Автор: 0lmer 24.10.2007, 15:00
Цитата(Папараццы @  23.10.2007,  14:51 Найти цитируемый пост)
Как найти программу если незнаем не пид не хендл ?


Синтаксис 
HWND FindWindow
(
LPCTSTR lpClassName,    // указатель на имя класса
LPCTSTR lpWindowName    // указатель на имя окна
);

Параметры 

lpClassName
Указывает на строку с нулевым символом в конце, которая определяет имя класса или - атом, который идентифицирует строку имени класса. Если этот параметр - атом, он должен быть общим атомом, созданным предыдущим вызовом функции GlobalAddAtom. Атом - это 16-разрядное значение, в котором должно быть помещено в младшем слове lpClassName; старшее слово должно быть нулевое.
lpWindowName
Указывает на строку с нулевым символом в конце, которая определяет имя окна (заголовок окна). Если этот параметр - ПУСТО (NULL), полное соответствие имени окна.

Возвращаемые значения
Если функция завершилась успешно, возвращаемое значение - дескриптор окна, которое имеет определенное имя класса и имя окна. Если функция терпит неудачу, возвращаемое значение - ПУСТО (NULL). Чтобы получить дополнительные данные об ошибках, вызовите GetLastError.

Автор: Папараццы 24.10.2007, 15:21
Код

HWND hwnd;
 hwnd = FindWindow(NULL,"notepad.exe");
 if ( hwnd != NULL)
{
SendMessage(hwnd,WM_DESTROY,0,0);
}

Будет ли это работать ? 

Автор: 0lmer 27.10.2007, 13:38
Код


HWND hwnd;
 hwnd = FindWindow(NULL,"Безымянный - Блокнот");
 if ( hwnd != NULL)
{
SendMessage(hwnd,WM_DESTROY,0,0);

}



скомпилил в билдере, работает. только если заголовок другой (например файл открыт) то не пашет.

Автор: THandle 27.10.2007, 18:07
0lmer,  В состав билдера(у меня BDS2006) входит программа ws32.exe с её помощью можно узнать класс окна.

Автор: Папараццы 30.10.2007, 14:39
А вот допустим у меня что то введено  и при закрытие в виде  WM_CLOSE он просит сохранить или не сохранить... Как нажать эту кнопку ? Например кнопку НЕТв диологовом окне "Блакнот" ? 

Автор: pandrew 30.10.2007, 15:15
Цитата(Папараццы @  30.10.2007,  14:39 Найти цитируемый пост)
А вот допустим у меня что то введено  и при закрытие в виде  WM_CLOSE он просит сохранить или не сохранить... Как нажать эту кнопку ? Например кнопку НЕТв диологовом окне "Блакнот" ?  

Уже упоминали прогу - ws32. Запусти ее и сможешь отследить весь поток сообщений, получаемых, к примеру notepad, при принудительном закрытии.

Автор: Папараццы 31.10.2007, 08:13
Ну я получил Child и т.д. У меня вопрос как нажать кнопку.. WM_ACTIVATE или что ? 

Автор: 0lmer 31.10.2007, 12:18
Цитата(Папараццы @  30.10.2007,  14:39 Найти цитируемый пост)
 и при закрытие в виде  WM_CLOSE он просит сохранить или не сохранить... Как нажать эту кнопку ?


а если попробовать не WM_CLOSE а WM_DESTROY? 
Я точно не уверен но может не будет спрашивать про сохранение.

Автор: Папараццы 31.10.2007, 15:08
Нет просто после нажатие на ОК в моем приложение будет идти запись в базу данных.

Автор: Папараццы 24.4.2008, 14:57
Что делать если WM_DESTROY не работает? А WM_CLOSE закрывает приложение но приложение просит потверждение. Как быть? 

Автор: 586 24.4.2008, 16:38
Для MessageBox'a:
Код
SendMessage(hWnd, WM_COMMAND, IDYES /*IDNO*/ /*IDCANCEL*/, 0);

Автор: Папараццы 29.4.2008, 12:38
Я попробовал на блокноте такое провернуть 
Код

HWND hwnd;
hwnd=FindWindow(0,"Безымянный - Блокнот");
SendMessage(hwnd,WM_CLOSE,0,0);
SendMessage(hwnd,WM_COMMAND,IDYES,0);

Но он у меня вместо "ДА" почему то нажимает на принт. Открываетяс страница печяти. 

Автор: 586 29.4.2008, 13:22
Цитата(Папараццы @  29.4.2008,  13:38 Найти цитируемый пост)
SendMessage(hwnd,WM_COMMAND,IDYES,0);

Надо в окно MessageBox'а это сообщение отправлять.

Автор: Папараццы 30.4.2008, 15:39
Я его не могу поймать. FindWindowEx - не работает. 

Автор: 586 30.4.2008, 16:24
Код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    HWND hWnd = FindWindow(NULL, "Безымянный - Блокнот");
    if(!hWnd) {
        ShowMessage("Window not found");
        return;
    }
    PostMessage(hWnd, WM_CLOSE, 0, 0);
    Sleep(300); // wait for show MessageBox....

    HWND hMsgBox = FindWindow(NULL, "Блокнот");
    if(!hMsgBox) {
        ShowMessage("MessageBox not found");
        return;
    }
    PostMessage(hMsgBox, WM_COMMAND, IDYES, 0);
}

Автор: Папараццы 2.5.2008, 10:23
Спасибо за код, сейчас попробую. 

Автор: Папараццы 2.5.2008, 12:38
Проблема в том что у меня он не перехватывает окно. Т.е. на блокноте он работает. Но на программе к каторой я хочу применить нет.

Автор: 586 2.5.2008, 13:07
К каждой программе нужен индивидуальный подход.
Если это диалоговое окно, то можно воспользоваться сообщением WM_COMMAND.
Если это форма VCL (прога написана в билдере или delphi), по лучше перечислять дочерние окна в этой форме, и сравнивать имя класса и текст в окне. Найденной кнопке отправлять сообщение BM_CLICK.

Автор: Папараццы 2.5.2008, 14:09
Не как не могу найти часть шде написано закрыть приложение. Win32 Sight оже не чего не показывает. 

Автор: 586 2.5.2008, 14:20
Скачай Spy++, там  есть "прицел" для поиска окон.

Автор: Sept 4.5.2008, 18:31
Народ, а как узнать пид процесса по имени ехешника?
Вот прошерстил всю хелпу и форум, а ничего другого так и не нашел..

Код

bool GetProcessByExeName(DWORD* Pid,AnsiString ExeName)
{
HANDLE hProcessSnap = NULL;
PROCESSENTRY32 pe32      = {0};
AnsiString temp="";

hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
if(hProcessSnap == (void*)-1)
        {
        MessageBox(NULL, "UNKNOWN", "UNKNOWN", MB_OK|MB_ICONWARNING|MB_SYSTEMMODAL);
        return false;
        }
pe32.dwSize=sizeof(PROCESSENTRY32);

if(Process32First(hProcessSnap,&pe32)) temp=pe32.szExeFile;
if((temp.UpperCase()).Pos(ExeName))
       {
       *Pid= pe32.th32ProcessID;
       CloseHandle (hProcessSnap);
       return true;
       }
pe32.dwSize=sizeof(PROCESSENTRY32);

while(Process32Next(hProcessSnap,&pe32))
        {
        temp=pe32.szExeFile;
        if((temp.UpperCase()).Pos(ExeName))
                {
                *Pid= pe32.th32ProcessID;
                CloseHandle(hProcessSnap);
                return true;
                }
        pe32.dwSize=sizeof(PROCESSENTRY32);
        }
        
CloseHandle(hProcessSnap);
*Pid=0;
return false;
}


ругается в 4 строке

Автор: Sept 4.5.2008, 19:03
оппа! уже не надо. поиск рулит, только пользоваться надо уметь ))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)