Форум: "Начинающим";
Текущий архив: 2007.01.21;
Скачать: [xml.tar.bz2];
ВнизСкрыть процес с панели задач (это не то о чём думаете))) Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.047 c