95a2f54683
git-svn-id: https://svn.code.sf.net/p/apophysis7x/svn/trunk@1 a5d1c0f9-a0e9-45c6-87dd-9d276e40c949
260 lines
6.1 KiB
ObjectPascal
260 lines
6.1 KiB
ObjectPascal
unit dwTaskbarComponents;
|
|
|
|
interface
|
|
|
|
{$INCLUDE 'DelphiVersions.inc'}
|
|
|
|
uses
|
|
Classes, Controls, Messages, dwTaskbarList;
|
|
|
|
procedure InitCommonControls; stdcall;
|
|
|
|
type
|
|
TdwTaskbarWinControl = class(TWinControl)
|
|
private
|
|
FIn32BitMode: Boolean;
|
|
FTaskbarList: ITaskbarList;
|
|
FTaskbarList2: ITaskbarList2;
|
|
FTaskbarList3: ITaskbarList3;
|
|
FTaskBarEntryHandle: THandle;
|
|
function GetTaskBarEntryHandle: THandle;
|
|
|
|
protected
|
|
procedure CreateParams(var Params: TCreateParams); override;
|
|
property In32BitMode: Boolean read FIn32BitMode;
|
|
property TaskbarList: ITaskbarList read FTaskbarList;
|
|
property TaskbarList2: ITaskbarList2 read FTaskbarList2;
|
|
property TaskbarList3: ITaskbarList3 read FTaskbarList3;
|
|
|
|
protected
|
|
class function GetComCtrlClass: Integer; virtual; abstract;
|
|
class function GetComCtrlClassName: PChar; virtual; abstract;
|
|
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
|
|
property TaskBarEntryHandle: THandle read GetTaskBarEntryHandle write FTaskBarEntryHandle;
|
|
end;
|
|
|
|
TdwTaskbarComponent = class(TComponent)
|
|
private
|
|
FHandle: Cardinal;
|
|
FMsgAutoInitialize: Cardinal;
|
|
FMsgUpdate: Cardinal;
|
|
FAutoInitialize: Boolean;
|
|
FIsInitialized: Boolean;
|
|
|
|
FTaskbarList: ITaskbarList;
|
|
FTaskbarList2: ITaskbarList2;
|
|
FTaskbarList3: ITaskbarList3;
|
|
FTaskBarEntryHandle: THandle;
|
|
function GetTaskBarEntryHandle: THandle;
|
|
protected
|
|
procedure CheckInitalization;
|
|
procedure SendUpdateMessage;
|
|
function DoInitialize: Boolean; virtual;
|
|
procedure DoUpdate; virtual;
|
|
|
|
property AutoInitialize: Boolean read FAutoInitialize write FAutoInitialize default True;
|
|
property TaskbarList: ITaskbarList read FTaskbarList;
|
|
property TaskbarList2: ITaskbarList2 read FTaskbarList2;
|
|
property TaskbarList3: ITaskbarList3 read FTaskbarList3;
|
|
|
|
property Handle: Cardinal read FHandle;
|
|
function HandleAllocated: Boolean;
|
|
procedure WndProc(var Message: TMessage); virtual;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
|
|
property TaskBarEntryHandle: THandle read GetTaskBarEntryHandle write FTaskBarEntryHandle;
|
|
property IsInitialized: Boolean read FIsInitialized;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
Forms, ComCtrls, Windows, ComObj, SysUtils;
|
|
|
|
procedure InitCommonControls; stdcall; external comctl32;
|
|
|
|
{ TdwCommon }
|
|
|
|
constructor TdwTaskbarWinControl.Create(AOwner: TComponent);
|
|
var
|
|
Obj: IInterface;
|
|
begin
|
|
inherited;
|
|
|
|
FIn32BitMode := InitCommonControl(GetComCtrlClass);
|
|
|
|
Obj := CreateComObject(CLSID_TaskbarList);
|
|
if Obj = nil then
|
|
begin
|
|
FTaskbarList := nil;
|
|
end
|
|
else
|
|
begin
|
|
FTaskbarList := ITaskbarList(Obj);
|
|
FTaskbarList.HrInit;
|
|
|
|
FTaskbarList.QueryInterface(CLSID_TaskbarList2, FTaskbarList2);
|
|
FTaskbarList.QueryInterface(CLSID_TaskbarList3, FTaskbarList3);
|
|
end;
|
|
|
|
end;
|
|
|
|
procedure TdwTaskbarWinControl.CreateParams(var Params: TCreateParams);
|
|
begin
|
|
if not In32BitMode then
|
|
InitCommonControls;
|
|
|
|
inherited;
|
|
|
|
CreateSubClass(Params, GetComCtrlClassName);
|
|
end;
|
|
|
|
function TdwTaskbarWinControl.GetTaskBarEntryHandle: THandle;
|
|
begin
|
|
if FTaskBarEntryHandle <> 0 then
|
|
begin
|
|
Result := FTaskBarEntryHandle;
|
|
end
|
|
else
|
|
begin
|
|
{$IFNDEF Delphi2007_Up}
|
|
Result := Application.Handle;
|
|
{$ELSE}
|
|
if not Application.MainFormOnTaskBar then
|
|
begin
|
|
Result := Application.Handle;
|
|
end
|
|
else
|
|
begin
|
|
Result := Application.MainForm.Handle;
|
|
end;
|
|
{$ENDIF}
|
|
end;
|
|
end;
|
|
|
|
{ TdwCommonComponent }
|
|
|
|
procedure TdwTaskbarComponent.CheckInitalization;
|
|
begin
|
|
if FIsInitialized then
|
|
raise Exception.Create('Thumbnails are initialized already.');
|
|
end;
|
|
|
|
constructor TdwTaskbarComponent.Create(AOwner: TComponent);
|
|
var
|
|
Obj: IInterface;
|
|
begin
|
|
inherited;
|
|
|
|
Obj := CreateComObject(CLSID_TaskbarList);
|
|
if Obj = nil then
|
|
begin
|
|
FTaskbarList := nil;
|
|
end
|
|
else
|
|
begin
|
|
FTaskbarList := ITaskbarList(Obj);
|
|
FTaskbarList.HrInit;
|
|
|
|
FTaskbarList.QueryInterface(CLSID_TaskbarList2, FTaskbarList2);
|
|
FTaskbarList.QueryInterface(CLSID_TaskbarList3, FTaskbarList3);
|
|
end;
|
|
|
|
if not (csDesigning in ComponentState) then
|
|
begin
|
|
FHandle := Classes.AllocateHWnd(WndProc);
|
|
end
|
|
else
|
|
begin
|
|
FHandle := 0;
|
|
end;
|
|
|
|
FAutoInitialize := True;
|
|
FIsInitialized := False;
|
|
FMsgAutoInitialize := RegisterWindowMessage('dw.Component.Taskbar.Thumbnails.Auto.Initialize');
|
|
FMsgUpdate := RegisterWindowMessage('dw.Component.Taskbar.Thumbnails.Update');
|
|
|
|
if HandleAllocated then
|
|
PostMessage(Handle, FMsgAutoInitialize, 0, 0);
|
|
end;
|
|
|
|
destructor TdwTaskbarComponent.Destroy;
|
|
begin
|
|
if HandleAllocated then
|
|
begin
|
|
Classes.DeallocateHWnd(FHandle);
|
|
FHandle := 0;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
function TdwTaskbarComponent.DoInitialize: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
procedure TdwTaskbarComponent.DoUpdate;
|
|
begin
|
|
|
|
end;
|
|
|
|
function TdwTaskbarComponent.GetTaskBarEntryHandle: THandle;
|
|
begin
|
|
if FTaskBarEntryHandle <> 0 then
|
|
begin
|
|
Result := FTaskBarEntryHandle;
|
|
end
|
|
else
|
|
begin
|
|
{$IFNDEF Delphi2007_Up}
|
|
Result := Application.Handle;
|
|
{$ELSE}
|
|
if not Application.MainFormOnTaskBar then
|
|
begin
|
|
Result := Application.Handle;
|
|
end
|
|
else
|
|
begin
|
|
Result := Application.MainForm.Handle;
|
|
end;
|
|
{$ENDIF}
|
|
end;
|
|
end;
|
|
|
|
function TdwTaskbarComponent.HandleAllocated: Boolean;
|
|
begin
|
|
Result := FHandle <> 0;
|
|
end;
|
|
|
|
procedure TdwTaskbarComponent.SendUpdateMessage;
|
|
begin
|
|
if HandleAllocated then
|
|
if FIsInitialized then
|
|
PostMessage(Handle, FMsgUpdate, 0, 0);
|
|
end;
|
|
|
|
procedure TdwTaskbarComponent.WndProc(var Message: TMessage);
|
|
begin
|
|
if Message.Msg = FMsgAutoInitialize then
|
|
begin
|
|
if FAutoInitialize then
|
|
begin
|
|
FIsInitialized := DoInitialize;
|
|
end;
|
|
end
|
|
else
|
|
if Message.Msg = FMsgUpdate then
|
|
begin
|
|
if FIsInitialized then
|
|
DoUpdate;
|
|
end;
|
|
|
|
end;
|
|
|
|
end.
|