Форум: "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