Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.012 c
3-1143049774
аматор
2006-03-22 20:49
2006.05.14
возможность работы с FlatSQL


2-1145947777
ADDARK
2006-04-25 10:49
2006.05.14
SysAllocString, SysFreeString


3-1142944091
Snip
2006-03-21 15:28
2006.05.14
IB & Dll Ошибка при закрытим приложения


3-1142556339
Tacit
2006-03-17 03:45
2006.05.14
DBGrid. Печать текущей строки


3-1142934088
SLP
2006-03-21 12:41
2006.05.14
Запись структурированных данных в поле таблицы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский