Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Скрыть программу в TaskBar+изменить имя в процесах


Автор: chiffa 9.11.2007, 20:57
Добрый день. у меня возникли такие 2 вопросика: 
1. Как не показывать открытую программу в панели задач (TaskBar), сейчас я делую это так:
Код

Application.CreateHandle;
ShowWindow(Application.Handle, SW_HIDE);
Application.ShowMainForm := FALSE;


и все работает нормально.

Но когда помещяю опеределенный код в TForm1.Timer1Timer (код застравляет форму перемещятся по экрану изменяя ее парамерты) в TaskBar опять повляется окошко формы...

2. Если у меня файл запустился с именем, к примеру 1.ехе я могу как то в списке отображаемых процесов поменять его отображаемое имя, к примеру на 2.ехе

зарание вс ем спасибо smile

Автор: THandle 9.11.2007, 21:02
Код

SetWindowLong(Application.Handle, GWL_EXSTYLE,GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);

Автор: chiffa 9.11.2007, 21:49
без изменений...

Автор: chiffa 10.11.2007, 20:53
никто не знает?...

Автор: smartov 10.11.2007, 21:00
chiffa, ну раз ее опять становится видно, то добавь к тому "определенному коду" 
Код

ShowWindow(Application.Handle, SW_HIDE);

в его конец

Добавлено через 1 минуту и 40 секунд
Цитата(chiffa @  9.11.2007,  19:57 Найти цитируемый пост)
2. Если у меня файл запустился с именем, к примеру 1.ехе я могу как то в списке отображаемых процесов поменять его отображаемое имя, к примеру на 2.ехе

Если первый пункт + описание "определенного кода" еще похожи на программу-шутку, то этот пункт - это уже слишком для шутки

Автор: chiffa 10.11.2007, 22:34
Цитата(smartov @  10.11.2007,  21:00 Найти цитируемый пост)
Если первый пункт + описание "определенного кода" еще похожи на программу-шутку, то этот пункт - это уже слишком для шутки 



эээээ, всмысле?

Автор: Akella 10.11.2007, 22:37
что будет делать твоя программа?

Автор: smartov 10.11.2007, 22:38
chiffa, в смысле том, что скрыть имя своего процесса нужно троянам или вирусам. Ты что пишешь первое или второе?

Автор: chiffa 10.11.2007, 22:52
тихо-тихо, че вы так то набросились на меня... я просто подумал что будет красиво, когда стартовый файл к примеру иммет имя start.exe а в процесах висит непосредственно название программы/проекта.

Кстати скрыть из тулбара так и не получается...

Автор: smartov 10.11.2007, 22:53
chiffa, красиво то красиво, но это считается уже "грязным" методом.

А почему с тулбара не получается? Ведь в самом начале то срабатывает? Ты вроде сказал, что срабатывает. Значит сам метод сокрытия работает.
Посмотри код, что у тебя выполняется по таймеру. Или покажи его тут. Поглядим что не так.

Добавлено @ 22:54
p.s. а ты уверен что трабла именно в таймере?
p.p.s у тебя ось WinXP?

Автор: chiffa 10.11.2007, 23:03
ось ХР
вот код:

Код

procedure TForm1.Timer1Timer(Sender: TObject);
var
i:Integer;
h:THandle;
begin




Visible:=true; 

SetWindowLong(Application.Handle, GWL_EXSTYLE,GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);


Form1.Top:=Screen.Height-Height;
Left:=1;

h:=CreateEvent(nil, true,false, 'et');
for i:=1 to 80 do
begin

Application.CreateHandle;
ShowWindow(Application.Handle, SW_HIDE);
Application.ShowMainForm := FALSE;

Top:=Screen.Height-Height-i*5;
Repaint; 
sleep (100);

Application.ProcessMessages ();

ShowWindow(Application.Handle, SW_HIDE);

end;


WaitForSingleObject(h,15);

for i:=80 to 1 do
begin
ShowWindow(Application.Handle, SW_HIDE);

Form1.Top:=Screen.Height-Height-i*5;
Repaint;
WaitForSingleObject(h,15) ;

ShowWindow(Application.Handle, SW_HIDE);
end;


ShowWindow(Application.Handle, SW_HIDE);

Closehandle(h); 
Visible:=false; 

ShowWindow(Application.Handle, SW_HIDE);
end;



относительно грязного метода.... впринципе согласин, но пользователя можно уведомлять или спрашивать перед тем как изменить имя процеса....

Автор: smartov 11.11.2007, 00:16
Цитата(chiffa @  10.11.2007,  22:03 Найти цитируемый пост)

относительно грязного метода.... впринципе согласин, но пользователя можно уведомлять или спрашивать перед тем как изменить имя процеса.... 

Ну да. Придеставь сейчас придут к нам Зимбабвийцы, скажем, и скажут - вы нам дайте ядреную бомбу, а мы если что - мы будем только уведомлять что она у нас есть. Правда-правда.

--

О коде. 
Кошмар, сколько мусорного кода...

Я расставил комментарии. Ты пораздумай над ними. Потому что лично я так понял, что ты не совсем себе представляешь как работает таймер.


Код

procedure TForm1.Timer1Timer(Sender: TObject);
var
    i:Integer;
    h:THandle;
begin
    //Visible:=true; это зачем?
    //SetWindowLong(Application.Handle, GWL_EXSTYLE,GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);

    Form1.Top := Screen.Height - Height;
    Left:=1;
    h:=CreateEvent(nil, true,false, 'et'); //интересно, что это за эвент такой обрабатывается

    for i:=1 to 80 do
        begin
            //Application.CreateHandle;
            //ShowWindow(Application.Handle, SW_HIDE);
            //Application.ShowMainForm := FALSE; //КАК у тебя вообще код работает? Ты же прячешь форму?
            Top := Screen.Height-Height-i*5;
            //Repaint(); она и сама перерисуется
            //sleep (100); ЗАЧЕМ sleep 100?? У нас же и так таймер!
            Application.ProcessMessages ();
            //ShowWindow(Application.Handle, SW_HIDE);
        end;

    WaitForSingleObject(h,15);

    for i:=80 to 1 do
        begin
            //ShowWindow(Application.Handle, SW_HIDE);
            Form1.Top:=Screen.Height-Height-i*5;
            //Repaint; 
            WaitForSingleObject(h,15) ;
            //ShowWindow(Application.Handle, SW_HIDE);
        end;

    //ShowWindow(Application.Handle, SW_HIDE);
    Closehandle(h); 
    //Visible:=false; так и знал что не используется

    //и в самом конце
    ShowWindow(Application.Handle, SW_HIDE);
end;


Дельфи у меня под рукой нет, но если бы я писал подобный прикол.
То у меня было бы 
1) на показ формы ( Form1Show() ) я бы повесил 
ShowWindow(Application.Handle, SW_HIDE);
Form1.Top := 0;
Form1.Left := 0;

2) Для простоты (прога мелкая), провозгласил бы две глобальные переменные incX : integer и incY : integer, по умолчанию равные incX := 1; incY := 1;

2) Повесил бы таймер с периодом срабатывания 50 милисекунд. На событие таймера ( Timer1Timer() ) сделал бы подобную процедуру
(учти, код пишу просто с головы, без проверки)
Код

procedure TForm1.Timer1Timer(Sender: TObject);
begin

    Form1.Left := Form1.Left + incX;
    Form1.Top := Form1.Top + incY;

    if ( (Form1.Left = 0) || ((Form1.Left + Form1.Width) = Screen.Width) ) then
        incX := -1*incX;

    if ( (Form1.Top = 0) || ((Form1.Top + Form1.Height) = Screen.Height) ) then
        incY := -1*incY;

    //ну и на всякий случай
    ShowWindow(Application.Handle, SW_HIDE);
end;


Добавлено @ 00:19
p.s. Я в общем лишь рекомендации могу дать. Последний раз практика дельфи у меня была год назад дней пять. А до этого полтора года назад. Но тем не менее основы, конечно, всегда остаются в памяти.

Автор: chiffa 11.11.2007, 00:24
пасиба! буду разбираться! а насчет имени процеса, причем тут бомба... считай что мне просто для общего развития...

Автор: ama_kid 11.11.2007, 00:24
Цитата(chiffa @  10.11.2007,  22:52 Найти цитируемый пост)
я просто подумал что будет красиво, когда стартовый файл к примеру иммет имя start.exe а в процесах висит непосредственно название программы/проекта
то, что висит в процессах - это не бирюльки, чтобы было красиво - это рабочая информация операционной системы...
Далее, по ошибкам:
Код
Application.CreateHandle;

Цитата
Do not call CreateHandle directly. In EXEs, the application’s constructor calls CreateHandle. In DLLs it does not.

Код
h:=CreateEvent(nil, true,false, 'et');

Код
WaitForSingleObject(h,15);

Не понял смысла этих действий вообще... Выкинул...
Код
for i:=80 to 1 do
цикл for с понижение итератора идет через оператор downto

Может я конечно что-то не догнал, но в итоге, после некоторых манипуляций, код, который делает тоже самое, что и данный тобой, и не показывает форму на панели задач - выглядит так:
Код
procedure TForm1.FormCreate(Sender: TObject);
begin
 SetWindowLong(Application.Handle, GWL_EXSTYLE,GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
 i:Integer;
begin
 Form1.Top:=Screen.Height-Height;
 Left:=1;
 for i:=1 to 80 do
  begin
   Top:=Screen.Height-Height-i*5;
   sleep (100);
   Application.ProcessMessages ();
  end;
 for i:=80 downto 1 do Form1.Top:=Screen.Height-Height-i*5;
end;


Добавлено через 26 секунд
smartov, обогнал  smile 

Автор: chiffa 11.11.2007, 00:31
ama_kid, спасибо! код выглядит компактнее и работает, но в панели задачь видна все равно...

Автор: smartov 11.11.2007, 00:35
chiffa, ну извини, было б Дельфи - честно проверил бы и дописал.
В понедельник глядишь дельфисты проснутся. Сделай up темы во второй половине дня - глядишь помогут

Автор: chiffa 11.11.2007, 00:39
понял. пасиба большое за помощь smile

Автор: Akella 11.11.2007, 01:35
Цитата(ama_kid @  11.11.2007,  00:24 Найти цитируемый пост)
то, что висит в процессах - это не бирюльки, чтобы было красиво - это рабочая информация операционной системы...

даже не системы, а сисьадмина

Автор: Akella 11.11.2007, 02:57
попробуй использовать свойство
Application.ShowMainformOnTaskbar := False;

Вставь его в файл проекта (меню Project -> View Source)

Добавлено через 21 секунду
но это свойство появилось в поздних версиях дельфи

Автор: chiffa 11.11.2007, 14:39
нуууу, у меня Делфи 2007, но на Application.ShowMainformOnTaskbar ругается, есть похожее: Application.ShowMainForm

Автор: THandle 11.11.2007, 17:36
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  h : THandle;
implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
 i:Integer;
begin
 Form1.Top:=Screen.Height-Height;
 Left:=1;
 for i:=1 to 80 do
  begin
   Top:=Screen.Height-Height-i*5;
   WaitForSingleObject(h, 15);
  end;
 for i:=80 downto 1 do
   begin
    Form1.Top:=Screen.Height-Height-i*5;
    WaitForSingleObject(h, 15);
   end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetWindowLong(Application.Handle, GWL_EXSTYLE,GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
  h := CreateEvent(nil, true, false, '');
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  CloseHandle(h);
end;

end.



Работает на ура.

Автор: THandle 11.11.2007, 17:58
Вот на всякий случай http://thandle.narod.ru/1.zip

Автор: ALI46 3.7.2010, 22:29
Цитата(THandle @  11.11.2007,  18:58 Найти цитируемый пост)
Вот на всякий случай Весь проект

из под Windows 7 В Delphi 7 это прокатило, в вот как сделать чтобы в RAD Studio 2010 работало?  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)