Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Скрыть процес с панели задач (это не то о чём думаете))) [D6, Win95/98, WinME, NT4, Win2k, WinXP]


heaven ©   (2006-12-29 21:23:00) 

Возникла необходимость скрыть чужой процесс с панели задач
Т.е. моя программа запускает c:\calc.exe :) и скрывает его с панели задач
если сделать ShowWindow(FindWindow(nil, 'Калькулятор'), SW_HIDE) то закроется его окно, так как сообщение было отправлено непосредственно окошку, а оно должно быть видно
а вот если так ShowWindow(Application.Handle, SW_HIDE) то работает как надо. Значит надо найти хэндл процесса калькулятора
пробовал WinExec, ShellExecute но эти функции не возвращают хэндл приложения

есть даже функция такая:

function Exec(CommandLine: string): THandle;
var
StInfo : TStartupInfo;
SeAttr : TSecurityAttributes;
ProcInfo : TProcessInformation;
ProcHandle : THandle;
begin
FillChar(StInfo,SizeOf(StInfo),0);
StInfo.cb := SizeOf(StInfo);
stInfo.dwFlags:=STARTF_USESHOWWINDOW;
StInfo.wShowWindow:=SW_SHOWDEFAULT;

SeAttr.nLength:=SizeOf(SeAttr);
SeAttr.bInheritHandle:=true;
SeAttr.lpSecurityDescriptor:=nil;

if CreateProcess(nil, PChar('c:\winnt\system32\calc.exe'), @SeAttr, @SeAttr, False,
NORMAL_PRIORITY_CLASS, nil, 'c:\', StInfo, ProcInfo) then
Result := ProcInfo.hProcess;
else
Result:= 0;
end;

но возвращаемое значение маловато чтобы походить на какой-либо хэндл
а вот  Result := ProcInfo.dwProcessId возвращает нормальный PID

посоветуйте что делать


$Pl@Sh   (2007-01-04 14:25:00) [1]


> Скрыть процес с панели задач ( это не то о чём думаете)))


Может тебе телепактором заделаться? НЕплохие бабки сшибать будешь :-)


Vovan #2   (2007-01-03 20:08:00) [2]

Решение Vovan #2   (02.01.07 16:05) [11] самое классное и соответсвующее.


Fredy314   (2007-01-03 16:39:00) [3]

ага и оказался на форме :-) єфектно.


так себе   (2007-01-03 11:07:00) [4]

А может так...
var
Window : HWND;
begin
 WinExec('calc.exe', SW_SHOWNORMAL);
 Window := FindWindow('SciCalc', nil);
 if Window <> 0 then
 Windows.SetParent(Window, Handle);
end;

И на панели задач иконки калькулятора нет


Vovan #2   (2007-01-02 16:05:00) [5]

Вот, написал. Прячет иконку калькулятора на три секунды:


procedure TformMain.btnExploreClick(Sender: TObject);
var
 ShellTrayWnd: HWnd;
 ReBarWindow32: HWnd;
 MSTaskSwWClass: HWnd;
 ToolbarWindow32: HWnd;
 Buff: PChar;
 S: array [0..1024] of Char;
 Info: TTBBUTTON;
 PID: THandle;
 PRC: THandle;
 R: Cardinal;
 n, i: Integer;
begin
 ShellTrayWnd := FindWindow('Shell_TrayWnd', nil);
 if ShellTrayWnd = 0 then begin ShowMessage('No taskbar found'); Exit; end;
 ReBarWindow32 := FindWindowEx(ShellTrayWnd, 0, 'ReBarWindow32', nil);
 if ReBarWindow32 = 0 then begin ShowMessage('Error with taskbar'); Exit; end;
 MSTaskSwWClass := FindWindowEx(ReBarWindow32, 0, 'MSTaskSwWClass', nil);
 if MSTaskSwWClass = 0 then begin ShowMessage('Error inside taskbar'); Exit; end;
 ToolbarWindow32 := FindWindowEx(MSTaskSwWClass, 0, 'ToolbarWindow32', nil); // not for Win95 *
 if ToolbarWindow32 = 0 then begin ShowMessage('Error inside tasks area'); Exit; end;

 n := SendMessage(ToolbarWindow32, TB_BUTTONCOUNT, 0, 0);

 memoWindows.Clear;
 memoWindows.Lines.Add(IntToStr(n) + ' buttons');

 GetWindowThreadProcessId(ToolbarWindow32, @PID);
 PRC := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, PID);
 Buff := VirtualAllocEx(PRC, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);

 for i := 0 to n-1 do
  begin
   FillChar(Info, SizeOf(Info), 0);
   WriteProcessMemory(PRC, Buff, @Info, SizeOf(Info), R);

   SendMessage(ToolbarWindow32, TB_GETBUTTON, i, Integer(Buff));
   ReadProcessMemory(PRC, Buff, @Info, SizeOf(Info), R);

   SendMessage(ToolbarWindow32, TB_GETBUTTONTEXT, Info.idCommand, integer(Integer(@Buff[0]) + SizeOf(Info)));
   ReadProcessMemory(PRC, Pointer(integer(@Buff[0]) + SizeOf(Info)), @S[0], SizeOf(S), R);

   if StrPas(S) = 'Calculator' then
    begin
     SendMessage(ToolbarWindow32, TB_HIDEBUTTON, i, 1);
     Sleep(3000);
     SendMessage(ToolbarWindow32, TB_HIDEBUTTON, i, 0);
     Break;
    end;
  end;

 VirtualFreeEx(PRC, Buff, 0, MEM_RELEASE);
 CloseHandle(PRC);

 memoWindows.Lines.Add('Finished');

 // * http://homepage1.nifty.com/kazubon/progdoc/tclock/taskbarhistory.html
end;


Galkov   (2007-01-02 02:09:00) [6]

Пардон, рука дрогнула... Так наверное лучше будет:

hcalck := FindWindow(nil, 'Калькулятор');
ShowWindow(hcalck, SW_HIDE);
SetWindowLong(hcalck,GWL_EXSTYLE,
 (GetWindowLong(hcalck,GWL_EXSTYLE) and not WS_EX_APPWINDOW)or WS_EX_TOOLWINDOW);
SetWindowPos(hcalck,0,0,0,0,0,
 SWP_SHOWWINDOW or SWP_FRAMECHANGED or SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER);


Galkov   (2007-01-02 02:07:00) [7]

Гм....
А эдак :))


> hcalck := FindWindow(nil, 'Калькулятор');
> ShowWindow(hcalck, SW_HIDE);
> SetWindowLong(hcalck,GWL_EXSTYLE,
>   (GetWindowLong(hcalck,GWL_EXSTYLE) and not WS_EX_APPWINDOW)or
> WS_EX_TOOLWINDOW);
> SetWindowPos(hcalck,0,0,0,0,0,
>   SWP_SHOWWINDOW or SWP_FRAMECHANGED or SWP_NOMOVE or SWP_NOSIZE
> or SWP_NOZORDER);


Vovan #2   (2007-01-01 22:54:00) [8]

>Galkov ©   (01.01.07 22:02) [7]

> то закроется его окно, так как сообщение было отправлено непосредственно окошку, а оно должно быть видно


Galkov   (2007-01-01 22:02:00) [9]

А так никто не пробовал ???

hcalck:=FindWindow(nil, 'Калькулятор');
SetWindowLong(hcalck,GWL_EXSTYLE,
 GetWindowLong(hcalck,GWL_EXSTYLE)or WS_EX_APPWINDOW);
ShowWindow(hcalck, SW_HIDE);


Vovan #2   (2007-01-01 14:05:00) [10]

Походу нужно обращаться к окну панели задач, искать там кнопку (по названию?) и убирать.


Fredy314   (2006-12-30 17:27:00) [11]

[4] нет таких функций.и "значёк" в меню формально значком не является.
способ прячущий кнопку с панели задач,я гдето видел, я даже видел прогу прячущую на выбор любые окна с панели, только без исходников.


heaven   (2006-12-30 14:27:00) [12]

ну расскажи хотябы смутно
а между иконкой в таскбаре и треем связь есть
есть функции, сворачивающее окно в трей и устанавливающие значёк, меню и т.д.


@!!ex   (2006-12-30 08:27:00) [13]


> heaven   (30.12.06 07:04) [2]

Гопосоди..... Вы хоть в курсе, что такое "иконка в трее"???
Она тут никак не поможет.
Потому как она никак не связана с кнопой на таксбарке.
Только у VCL приложений есть Application.
calc.exe написан предположительно на С++. ;)
Способ есть, ищи.
Но я его смутно помню.


heaven   (2006-12-30 07:04:00) [14]

да, я знал что application это окно, но не знал что оно нулевого размера и всё такое ))
блин, что совсем никак?
а вот если свернуть значёк на панели задач в трей и сделать иконку(в трее) невидимой?


DrPass   (2006-12-30 02:01:00) [15]


> а вот если так ShowWindow(Application.Handle, SW_HIDE) то
> работает как надо. Значит надо найти хэндл процесса калькулятора

Application.Handle - это не хендл процесса. Это хендл главного окна приложения. Хитрый трюк Borland - "настоящее" главное окно у приложений Delphi изначально нулевого размера, и ты можешь как угодно делать ему SHOW/HIDE. С виндовым калькулятором такой трюк не пройдет, даже если узнаешь хендл его процесса


Наверх

Титульная страница Поиск, карта сайта Написать письмо