Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Вниз

как спрятать приложение(не смешно)   Найти похожие ветки 

 
Prov ©   (2004-01-19 00:42) [0]

Доброе время суток, господа программисты...
Не писал каких-то 4 месяца, а забыл всё ! :((
Я что-то делаю неправильно.
Вообщем, проблема такова:

Ловлю хэндл окна, пытаюсь его спрятать вот так:
ShowWindow(Wnd, SW_HIDE);
Всё бы хорошо но, когда нажимаю комбинацию клавиш Alt+Tab, видно иконку приложения. Как её спрятать ? Приложение прячется, но и иконки по Alt+Tab не должно быть. Подскажите, пожалуйста, как быть ?

И вот ещё. Вроде бы прятал приложения ещё и так:
SendMessage(Wnd, SW_HIDE, 0, 0) - окно не прячет... Подскажите, пожалуйста, и по сему вопросу...
Заранее благодарен всем, кто оказал какую-либо помощь в решении вопроса.


 
Diamond Cat ©   (2004-01-19 02:56) [1]

создавать окно с флагом WS_EX_TOOLWINDOW


 
VMcL ©   (2004-01-19 06:52) [2]

...или, если есть Application, ,ShowWindow(Application.Handle, SW_HIDE);


 
Prov ©   (2004-01-19 07:12) [3]

Спасибо большое.. Приложение я прячу не только своё, а и со стороны тоже.. Напомните мне, пожалуйста, как изменить расширенный стиль окна приложения на WS_EX_TOOLWINDOW, помню только, что-то типа:
SetWindowLong(Wnd, GWL_EXSTYLE, getwindowlong(...,...,...) or WS_EX_TOOLWINDOW) но что-то не получается.. иль может ещё что-то надо добавить ?


 
VMcL ©   (2004-01-19 15:17) [4]

Если своего и оно VCL"ное, то перекрой CreateParams. А вообще у тебя вроде правильно написано:
SetWindowLong(Wnd, GWL_EXSTYLE, GetWindowLong(Wnd, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);


 
YuRock ©   (2004-01-19 15:22) [5]

Лучше всего в 5-й винде прятать прогу так:


// Где-нибудь в Interface
function RegisterServiceProcess(d1, d2 : DWORD) : DWORD; stdcall; external "kernel32.dll";
...
// Например, в OnCreate главной формы
RegisterServiceProcess(0, 1);


В итоге приложение "уйдет" из списка задач.


 
DeadMeat ©   (2004-01-19 16:16) [6]

> YuRock ©   (19.01.04 15:22)
Ага... И с экрана оно тоже уйдёт, и из ALT+TAB тоже спрячется...


 
YuRock ©   (2004-01-19 16:27) [7]

> DeadMeat ©   (19.01.04 16:16) [6]

Не, ну уж извините, что, ShowWindow(hWindow, SW_HIDE) тяжело написать?


 
DeadMeat ©   (2004-01-19 17:10) [8]

> YuRock ©   (19.01.04 16:27)
Так о том и речь, что не всё просто так получается...

> Prov
Попрбуй как вариант выяснять, может у окна есть родитель. Если есть, то прячь его...


 
BiN ©   (2004-01-19 17:24) [9]

SetWindowLong(Handle, GWL_EXSTYLE,
 GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW
 and not WS_EX_APPWINDOW);


 
YuRock ©   (2004-01-19 17:28) [10]

>

Окно прячется ч-з ShowWindow, а "из Alt+Tab убирается" ч-з RegisterServiceProcess


 
BiN ©   (2004-01-19 17:41) [11]

RegisterServiceProcess, как видно даже из названия, регистрирует процесс, как кнедоступный пользователю через таск-менеджер, что никак не сказывается на окнах данного процесса. см [9]


 
YuRock ©   (2004-01-19 18:00) [12]

> BiN ©   (19.01.04 17:41) [11]

Во класс! А я и не знал! См. [10]!

> Prov
Причем спрятать (убрать из таск-менеджера) можно процесс только "изнутри него". Другие процессы не получится (ни одним из предложенных методов).


 
DVM ©   (2004-01-19 18:01) [13]

К этим всем способам можно еще такой добавить: название окна сделать пустым - "" и его не буде на панели задач и ALT+TAB. В процессах естесственно будет.


 
Игорь Шевченко ©   (2004-01-19 18:52) [14]

YuRock ©   (19.01.04 17:28)

Окно из Alt+Tab убирается, если у него выставлен стиль WS_EX_TOOLWINDOW


 
YuRock ©   (2004-01-19 19:06) [15]

> Игорь Шевченко ©   (19.01.04 18:52) [14]

Я с этим и не спорил. Возможно, это еще один способ. Но как выставить этот стиль "чужому" окну (другого процесса)?..


 
DeadMeat ©   (2004-01-19 22:26) [16]

> YuRock ©   (19.01.04 19:06)
> Но как выставить этот стиль "чужому" окну (другого процесса)?..
см. BiN ©   (19.01.04 17:24) [9]


 
Игорь Шевченко ©   (2004-01-20 10:23) [17]

YuRock ©   (19.01.04 19:06)


> Но как выставить этот стиль "чужому" окну (другого процесса)?..


ЗАЧЕМ ?????? Вопль души уже, к тебе, разумеется, не относится, а относится ко всем желающим странного с чужими окнами и процессами.

Способ выставить стили окна чужого приложения, разумеется есть, но не следует забывать, что при смене стилей оконной процедуре посылается пара сообщений WM_STYLECHANGING и WM_STYLECHANGED, обработав которые можно запретить любые изменения стиля окна, как со стороны, так и самому :)

С уважением,


 
YuRock ©   (2004-01-20 11:12) [18]

> DeadMeat ©   (19.01.04 22:26) [16]
>>  Но как выставить этот стиль "чужому" окну (другого процесса)?..

> см. BiN ©   (19.01.04 17:24) [9]

А интересно, Вы (и/или BiN) этот пример пробовали или в Рихтере прочитали?


 
BiN ©   (2004-01-20 11:35) [19]

YuRock ©   (20.01.04 11:12) [18]
Конечно пробовали. (а что плохого в Рихтере - картинок мало?)


 
YuRock ©   (2004-01-20 13:57) [20]

> BiN ©   (20.01.04 11:35) [19]

Что, в Рихтере "на картинках" нарисовано, что [9] будет работать для окон других процессов??? (см. DeadMeat [16]).

А, извините, Вы же пробовали. Можно Ваш код попробовать у себя?


 
DeadMeat ©   (2004-01-20 18:46) [21]

> YuRock ©   (20.01.04 13:57) [20]
Не знаю что у вас не выходит, но окно калькулятора, после установки ему WS_EX_TOOLWINDOW из ALT+TAB у меня ушло...
Может мы друг-друга не поняли...??


 
YuRock ©   (2004-01-20 19:19) [22]

> DeadMeat ©   (20.01.04 18:46) [21]

The SetWindowLong function fails if the window specified by the hWnd parameter does not belong to the same process as the calling thread.

Цитата из хелпа. Я проверял - возвращается 0 (если процесс чужой).


 
BiN ©   (2004-01-20 23:20) [23]

YuRock ©   (20.01.04 19:19) [22]

Если бы я не проверял этот пример, то и не стал бы выкладывать здесь [9].

И вместо того, чтобы злиться лучше бы ты посерьезней исследовал этот пример.
win32.hlp в поставке дельфи, к сожалению, является устаревшей версией справки MSDN. В справке же от майкрософта на сайте есть следующее замечание по поводу SetWindowLong:

Windows 95/98/Me: The SetWindowLong function may fail if the window specified by the hWnd parameter does not belong to the same process as the calling thread.

Думаю, видна разница.


 
VMcL ©   (2004-01-22 07:46) [24]

Я даже догадываюсь, когда она может fail: GWL_WNDPROC или DWL_DLGPROC :))


 
Prov ©   (2004-01-22 08:07) [25]

Всем большое спасибо.
Для общего развития скажу, что пишу программу я на 98 винде, но будет использоваться для ХР. Для некоторых людей скажу, что я знаю, что такое RegisterServiceProcess, и если понадобится, то даже умею спрятать от таскМенеджера в НТ. :))
делаю так:
SetWindowLong(Wnd, GWL_EXSTYLE, GetWindowLong(Wnd, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
Окно всё равно видно на панели задач. Причём, тоже самое пишу для окна своего приложения, и оно тоже не прячется. Ничего не могу понять, всё делаю в точности с помощью и хелпами.
И вот ещё, пожалуйста, скажите мне вот что: я раньше прятал приложения так: SendMessage(Wnd, SW_HIDE, ..., ...); Но не помню, какие нужны параметры для сообщения SW_HIDE. ПОдскажите, плиз.


 
YuRock ©   (2004-01-22 10:23) [26]

SW_HIDE - это не сообщение, а один из флагов функции ShowWindow;

Использовать надо так: ShowWindow(Wnd, SW_HIDE);


 
YuRock ©   (2004-01-22 10:23) [27]

SW_HIDE - это не сообщение, а один из флагов функции ShowWindow;

Использовать надо так: ShowWindow(Wnd, SW_HIDE);


 
YuRock ©   (2004-01-22 10:30) [28]

Извините за дублирование - я не специально


 
Игорь Шевченко ©   (2004-01-22 11:04) [29]


> SetWindowLong(Wnd, GWL_EXSTYLE, GetWindowLong(Wnd, GWL_EXSTYLE)
> or WS_EX_TOOLWINDOW);
> Окно всё равно видно на панели задач. Причём, тоже самое
> пишу для окна своего приложения, и оно тоже не прячется.
> Ничего не могу понять, всё делаю в точности с помощью и
> хелпами.


Раз ты такой умный, что можешь спрятаться от Task Manager в NT, то наверное и эту проблему тебе решить - пара пустяков, достаточно запустить WinSight.

---
LMD


 
Prov ©   (2004-01-24 13:06) [30]


> Раз ты такой умный, что можешь спрятаться от Task Manager
> в NT, то наверное и эту проблему тебе решить - пара пустяков,
> достаточно запустить WinSight.

Прошу Вас, не надо ехидничать.. Я прекрастно знаю, что Ваши знания в сфере программирования огромны. Если что не так ляпнул, прошу прощения, но не могли бы Вы мне всё-таки подсказать решение этой задачи... Я довольно долго не писал ничего, многое забылось...
Но приложение всё равно не уходит с панели задач.


 
Игорь Шевченко ©   (2004-01-24 20:01) [31]

Prov ©   (24.01.04 13:06)

А мне без кода трудно будет подсказывать...Код бы надо привести в форуме, хотя бы краткий :)


 
Prov ©   (2004-01-24 22:38) [32]

var Wnd: hWnd;
begin
 if FindWindow(nil, "Gen")<> 0 tnen
 Wnd:= FindWindow(nil, "Gen");
 ShowWindow(Wnd, SW_HIDE);
end;

Окно не прячется :((


 
Игорь Шевченко ©   (2004-01-25 19:58) [33]

Перед фразой

ShowWindow(Wnd, SW_HIDE);

Я бы поставил проверку:

 if IsWindow(Wnd) then
   ShowWindow(Wnd, SW_HIDE)
 else
   raise Exception.Create ("Не получилось");


 
YuRock ©   (2004-01-26 13:41) [34]

Я бы сделал так:

var Wnd: hWnd;
begin
Wnd := FindWindow(nil, "Gen");
if Wnd <> 0 tnen ShowWindow(Wnd, SW_HIDE)
else raise Exception.Create ("Окно не найдено!");
end;



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.05 c
1-1079431499
Alex Shulg
2004-03-16 13:04
2004.04.04
MessageBox &amp; mb_Help ???


3-1078594297
Nikis
2004-03-06 20:31
2004.04.04
Таблица DOS-кодировки


6-1075074207
Daniel
2004-01-26 02:43
2004.04.04
Какое различать сокеты?


14-1079011660
sad
2004-03-11 16:27
2004.04.04
Unix.Копирование с ленты определенного каталога


3-1078910413
Pavel
2004-03-10 12:20
2004.04.04
Blob





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский