Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.14;
Скачать: CL | DM;

Вниз

убить скрытое окно, не делая его видимым   Найти похожие ветки 

 
Дубинка   (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 вся ветка

Текущий архив: 2006.05.14;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.044 c
2-1145856478
makar
2006-04-24 09:27
2006.05.14
Вывод данных через Application.MessageBox


2-1145867869
Keks
2006-04-24 12:37
2006.05.14
Всплывающие сообщения


15-1144404805
MBo
2006-04-07 14:13
2006.05.14
Пятничные задачки


15-1145536258
Суслик
2006-04-20 16:30
2006.05.14
Вышел второй update для bds2006


2-1146083600
chai
2006-04-27 00:33
2006.05.14
Работа с поинтерами: корректен ли этот код?