![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Скрыть процес с панели задач (это не то о чём думаете))) [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. С виндовым калькулятором такой трюк не пройдет, даже если узнаешь хендл его процесса