Форум: "WinAPI";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];
Внизубить скрытое окно, не делая его видимым Найти похожие ветки
← →
Дубинка (2006-02-15 13:57) [0]Как можно убить скрытое (SW_HIDE) окно, не делая его видимым (SW_SHOW)?
В приведенном ниже коде прога не закрывается сама, а продолжает работать. Причем, если поменять в тексте SW_HIDE на SW_SHOW, этого не происходит. Мне надо убить именно окно, а не процесс, так как он мне еще нужен, после закрытия окна.program Example;
uses Messages, Windows;
var
WindowClass: TWndClass;
MainWindow: HWnd;
Mesg: TMsg;
function WindowProc(Wnd: HWND; Msg: Integer; wParam, lparam: LongInt): LongInt; stdcall;
begin
case Msg of
WM_Destroy : PostQuitMessage(0);
else Result := DefWindowProc(Wnd, Msg, wParam, lParam);
end;
end;
begin
ZeroMemory(@WindowClass, sizeof(WindowClass));
WindowClass.style := CS_HRedraw or CS_VRedraw;
WindowClass.lpfnWndProc := @WindowProc;
WindowClass.hInstance := hInstance;
WindowClass.hIcon := LoadIcon(0, IDI_Application);
WindowClass.hCursor := LoadCursor(0, IDC_Arrow);
WindowClass.hbrBackground := COLOR_BTNFACE+1;
WindowClass.lpszMenuName := nil;
WindowClass.lpszClassName := "WinMin : Main";
RegisterClass(WindowClass);
MainWindow := CreateWindow("WinMin : Main", "Win Min", WS_OVERLAPPED, 100, 100, 200, 200, 0, 0, hInstance, nil);
ShowWindow(MainWindow, SW_HIDE);
while GetMessage(Mesg, 0, 0, 0) do begin
TranslateMessage(Mesg);
DispatchMessage(Mesg);
PostQuitMessage(0);
end;
end.
← →
kaZaNoVa © (2006-02-15 14:05) [1]window.close
← →
Игорь Шевченко © (2006-02-15 14:11) [2]А зачем его надо убить ? Какой смысл ?
kaZaNoVa © (15.02.06 14:05) [1]
"Просто потрепаться вы можете в соответствующей конференции"
← →
begin...end © (2006-02-15 14:15) [3]> while GetMessage(Mesg, 0, 0, 0) do begin
> ...
> PostQuitMessage(0);
> end;
???
8-О
← →
Дубинка (2006-02-15 14:20) [4]Блин долго объяснять.... Либо если этот вопрос не имеет ответа - подскажите какую-нить штуку, которая после завершения выполнения приложения происходит автоматически, даже если приложение завершилось ошибкой. Я тока закрытие окна и нашел...
Зачем нужно:
Есть прога - УЖАСНО нестабильная, она виснет и глючит очень часто, но перезапустить ее нельзя, она выполняет, как это не смешно критически важные операции... Дело короче в том, что я придумал такую технологию, прога вызывает сама себя и получается, что оан запущена в двух экземплярах, один активно работающий, другой нет. Они пытаются найти окна друг друга и в случае его закрытия (именно из-за ошибки) они запускают друг друга. Проблема в том, что для того чтобы выключить эту прогу, надо окна поубивать, а окна невидимые - они ничего не делают... вот. Я хотел еще mutex"ы использовать, но они остаются в памяти если прога их вызвавшая завершилась неправильно и не удалила их.
← →
Дубинка (2006-02-15 14:22) [5]2 begin...end
А че такого? По идее должно закрыться, закрывается же, если SW_SHOW... Если так не устраивает - можно поменять на DestroyWindow(MainWindow) - ничего не изменится.... Как и от SendMessage(..WM_DESTROY..);
← →
Игорь Шевченко © (2006-02-15 14:29) [6]
> А че такого?
Работать не будет
> Есть прога - УЖАСНО нестабильная, она виснет и глючит очень
> часто
Странный у тебя метод решения проблем. Большинство пытаются глюки исправить.
> Проблема в том, что для того чтобы выключить эту прогу,
> надо окна поубивать
Никак не могу понять - зачем окна убивать.
← →
begin...end © (2006-02-15 14:30) [7]> Дубинка (15.02.06 14:22) [5]
Я не совсем понимаю, почему надо ставить в очередь WM_QUIT (а значит, выходить из цикла обработки сообщений и завершать программу) сразу после получения окном первого сообщения.
← →
Дубинка (2006-02-15 14:35) [8]2 begin...end - я к примеру! Мне надо будет прервать выполнение проги в другой момент! Мне главное - понять, почему не выходит, когда окно скрыто! Да, да, такой я восклицательный...
2 Игорь - глюки не исправить, они связаны с работой со сторонним приложением. И тупым юзером (еще тупее меня) А окна поубивать - если они будут продолжать существовать - вторая часть этой проги моментально себя восстановит.
← →
Игорь Шевченко © (2006-02-15 14:52) [9]Окно убивается вызовом функции DestroyWindow или отсылкой сообщений WM_CLOSE, WM_DESTROY - но я честно не понимаю, чем это может помочь.
← →
kaZaNoVa © (2006-02-15 17:14) [10]Дубинка (15.02.06 14:35) [8]
вторая часть этой проги моментально себя восстановит.
а с этого места поподробнее ..
← →
Style © (2006-02-15 17:43) [11]
> Я хотел еще mutex"ы использовать, но они остаются в памяти
> если прога их вызвавшая завершилась неправильно и не удалила
> их.
Непонятно... Прога вызывающая Mutex"ы - это твоя прога???
Помоему объекты ядра типа Mutex непосредственно связаны с ProcessID, и если процесса такого нет, то мьютекс с таким же именем можно будет создать снова...
Другое дело если программа зависла...
program sysexcept;
uses Windows;
begin
CreateMutex(nil, false, "MyMutex");
if (GetLastError = ERROR_ALREADY_EXISTS) then
MessageBox(0,"Mutex Exists","Warning",MB_OK)
else
begin
if( MessageBox(0,"Mutex not Exists, do exception?","Warning",MB_YESNO) = ID_YES) then
begin
TObject(0).Destroy; // error!
end;
end;
end.
1. Запускаем программу... Мьютекса нет... Она создает его.
2. Запускаем второй экземляр программы - ... мьютекс существует. Жмем ОК - второй экземляр закрывается... .
3. Жмем Yes и приводим к ошибке первую программу... Поскольку нет обработчиков ошибок, вываливается системное сообщение об ошибке...
4. Снова запускаем второй экземляр программы - болт :) ... мьютекс существует. Жмем ОК и закрываем его...
5. Закрываем окно системного сообщения об ошибке...
6. Возвращаемся к пункту 1. все работает как и работало...
Т.е пока существует Process который создал мьютекс, даже если произошло исключение (exception) на уровне системы - мьютекс тоже существует.
Если эта чужая глючная программа, то я думаю, что можно запустить ее в Debug режиме, тогда еще можно попробовать что-то сделать если произошел exception.
← →
Дубинка (2006-02-18 20:41) [12]Моя прога работает с чужой прогой, а не запускает ее...
решил я проблему без окон, но несколько кривовато - я дал ехешнику хитрое имя и после запуска он циклически проверяет список процессов на наличие этого имени, и, если имя найдено один раз, а не два, запускает сам себя. в параметрах командной строки он передает not(свои параметры), что приводит к тому, что прога запущена всегда в двух экземплярах с разными параметрами. Один экземпляр ничего не делает, чтоб не повисло а второй себя запускает.... На вопрос все таки остался открытым... по ходу дела нельзя убить невидимое окно.
← →
kaZaNoVa © (2006-02-18 21:31) [13]Дубинка (18.02.06 20:41) [12]
Один экземпляр ничего не делает, чтоб не повисло а второй себя запускает....
забавно, но для чего такая схема:)))?
почему нельзя .. WM_Close разве не помогает?))
← →
Дубинка (2006-02-19 00:30) [14]проверьте! нет.
← →
Дубинка (2006-02-19 00:30) [15]кстати, WM_CLOSE его просто сворачивает, а WM_DESTROY - убивает.
← →
Дубинка (2006-02-19 00:33) [16]ой, вру, убивает.... Но только все-таки если оно SW_SHOW... если SW_HIDE - нет
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c