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

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

Скрыть приложение с панели задач [D7, WinXP]


Stanislav ©   (2006-01-18 11:15:00) 

Имеется Handle окна, можно ли скрыть с панели задач приложение, которому пренадлежит окно?
Или узнать Handle самого приложения?


Rouse_   (2006-01-18 23:40:00) [1]

ЗЫ: с TB_ISBUTTONHIDDEN явно погорячился :)


Rouse_   (2006-01-18 23:36:00) [2]

Мдя... хотел зайти с другой стороны... Но так не получилось. На всякий случай держи код экспериментов :)

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls, CommCtrl;

type
 TForm1 = class(TForm)
   lvButtons: TListView;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   TaskBarHandle: THandle;
 public
   function GetAllTaskBarButtons: Boolean;
   function GetTaskBarButtonText(const Index: Integer): String;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.GetAllTaskBarButtons: Boolean;
var
 TmpHandle: THandle;
 I, ButtonCount: Integer;
begin
 TmpHandle := FindWindow('Shell_TrayWnd', nil);
 if TmpHandle = 0 then RaiseLastOSError;
 TmpHandle := FindWindowEx(TmpHandle, 0, 'ReBarWindow32', nil);
 if TmpHandle = 0 then RaiseLastOSError;
 TmpHandle := FindWindowEx(TmpHandle, 0, 'MSTaskSwWClass', nil);
 if TmpHandle = 0 then RaiseLastOSError;
 TaskBarHandle := FindWindowEx(TmpHandle, 0, 'ToolbarWindow32', nil);
 if TaskBarHandle = 0 then RaiseLastOSError;
 ButtonCount := SendMessage(TaskBarHandle, TB_BUTTONCOUNT, 0, 0);
 for I := 0 to ButtonCount - 1 do
   if SendMessage(TaskBarHandle, TB_ISBUTTONHIDDEN, I, 0) <> 0 then
     lvButtons.Items.Add.Caption := GetTaskBarButtonText(I);
end;

function TForm1.GetTaskBarButtonText(const Index: Integer): String;
var
 TaskBarProcessID, TaskBarProcessHandle: THandle;
 AllocCaption: Pointer;
 BytesRead: Cardinal;
 Size: Integer;
 ButtonCaption: String;
begin
 GetWindowThreadProcessId(TaskBarHandle, TaskBarProcessID);                  
 TaskBarProcessHandle := OpenProcess(PROCESS_VM_OPERATION or
   PROCESS_VM_READ or PROCESS_VM_WRITE, False, TaskBarProcessID);
 if TaskBarProcessHandle = 0 then
   RaiseLastOSError
 else
 try
   AllocCaption := VirtualAllocEx(TaskBarProcessHandle, nil,
     MAXCHAR, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
   if AllocCaption = nil then
     RaiseLastOSError
   else
   try
     Size := SendMessage(TaskBarHandle, TB_GETBUTTONTEXT, Index, Integer(AllocCaption));
     if Size = 0 then RaiseLastOSError;
     if Size < 0 then Exit;
     SetLength(ButtonCaption, Size + 1);
     if not ReadProcessMemory(TaskBarProcessHandle, AllocCaption,
       @ButtonCaption[1], Size, BytesRead) then
       RaiseLastOSError;
     if ButtonCaption = 'Windows TaskManager'#0 then
       SendMessage(TaskBarHandle, TB_HIDEBUTTON{TB_DELETEBUTTON}, Index, 0);
     Result := ButtonCaption;
   finally
     VirtualFreeEx(TaskBarProcessHandle, AllocCaption, 0, MEM_RELEASE);
   end;
 finally
   CloseHandle(TaskBarProcessHandle);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 GetAllTaskBarButtons;
end;

end.


Нужно копаться в самом шеле...


VirEx   (2006-01-18 18:56:00) [3]

или getwindowlong(findwindow(nil,'form1'),GWL_HWNDPARENT)
или getwindow(findwindow(nil,'form1'),GW_OWNER)


VirEx   (2006-01-18 18:55:00) [4]

или getwindowlong(findwindow('form1',nil),GWL_HWNDPARENT)
или getwindow(findwindow('form1',nil),GW_OWNER)


VirEx   (2006-01-18 18:52:00) [5]

getparent()?


Rouse_   (2006-01-18 18:44:00) [6]

Хм... не доглядел :)


Игорь Шевченко   (2006-01-18 18:43:00) [7]

Rouse_ ©   (18.01.06 18:42) [6]

Окно-то не свое


Rouse_   (2006-01-18 18:42:00) [8]

А что, ShowWindow(Application.Handle, SW_HIDE); уже не в почете? :)


Игорь Шевченко   (2006-01-18 17:48:00) [9]

VirEx ©   (18.01.06 17:30) [4]

Окно после этого пересоздавать не надо ?


VirEx   (2006-01-18 17:30:00) [10]


>  [1] Игорь Шевченко ©   (18.01.06 11:53)

у VCL есть
изменить стиль (добавить в расширенный стиль WS_EX_TOOLWINDOW)


Stanislav   (2006-01-18 13:25:00) [11]

Спасибо, разобрался!


Stanislav   (2006-01-18 13:07:00) [12]

А можно ли запретить закрывать (С помощью кнопки закрыть или Alt+F4) окно  зная его Handle ?


Игорь Шевченко   (2006-01-18 11:53:00) [13]

У приложения нету Handle


> можно ли скрыть с панели задач приложение, которому пренадлежит
> окно?


Вряд ли


Наверх

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