Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.21;
Скачать: CL | DM;

Вниз

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

 
heaven   (2006-12-29 21:23) [0]

Возникла необходимость скрыть чужой процесс с панели задач
Т.е. моя программа запускает 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

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


 
DrPass ©   (2006-12-30 02:01) [1]


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

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


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

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


 
@!!ex ©   (2006-12-30 08:27) [3]


> heaven   (30.12.06 07:04) [2]

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


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

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


 
Fredy314 ©   (2006-12-30 17:27) [5]

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


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

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


 
Galkov ©   (2007-01-01 22:02) [7]

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

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


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

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

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


 
Galkov ©   (2007-01-02 02:07) [9]

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


> 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:09) [10]

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

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-02 16:05) [11]

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


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;


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

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

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


 
Fredy314 ©   (2007-01-03 16:39) [13]

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


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

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


 
$Pl@Sh ©   (2007-01-04 14:25) [15]


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


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



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

Текущий архив: 2007.01.21;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.078 c
4-1157629234
apollon604
2006-09-07 15:40
2007.01.21
Переключение окон в панели задач


11-1144047866
Vadim Petrov
2006-04-03 11:04
2007.01.21
Навести порядок в компонентах


15-1167320179
Rouse_
2006-12-28 18:36
2007.01.21
С днем рождения, Линус!


1-1164626091
Stanislav
2006-11-27 14:14
2007.01.21
Добавление новых форм на панель задач


6-1155930238
Rescator
2006-08-18 23:43
2007.01.21
Клиент веб-чата на делфи. Как реализовать?