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