Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
8-1148319518
igp
2006-05-22 21:38
2007.01.21
Помогите разобраться с PNG, использование вместо формы.


2-1167202386
XTD
2006-12-27 09:53
2007.01.21
Код Asm.


3-1162205718
oleg_v
2006-10-30 13:55
2007.01.21
как обнулить (обновить) поле Autoincrement(+)


2-1167752715
Ламер 2.Х
2007-01-02 18:45
2007.01.21
Сайлы


15-1167284178
Тульский
2006-12-28 08:36
2007.01.21
Помогите узнать фильм





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский