home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1998 June
/
Vpr9806a.iso
/
OLS
/
Windows
/
ntaskbar
/
ntaskbar.lzh
/
NTASKAPI
/
NTASKAPI.PAS
< prev
Wrap
Pascal/Delphi Source File
|
1996-09-02
|
17KB
|
487 lines
unit Ntaskapi;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, Menus;
{***************************************************
NICOLE TaskBar Addon Programming Interface (NTASK-API)
TNicoleAddonコンポーネント ver1.0
このソースはライセンスフリーで無保証です。
一応、Delphi2.0でも1.0でもコンパイルできます
自由に改造したり、それを配布したりするのは自由です。
NICOLE TaskBarのアドオンについてもフリーです
NICOLE TaskBarのアドオンとして作成されたプログラムを
シェアウェアにするのも、配布するのも自由です。
私(NICOLE)への連絡や許可を取る必要はありません
但し、私(NICOLE)は、このコードを利用した事による
いかなる責任も持ちませんので、ご了承下さい
コードに無駄な部分があったりしますが
私はプロのプログラマではないので・・・
TAB = 2 で見て下さい
***************************************************}
const
NTASKBAR_MSG = WM_USER + $200;
NTASKBAR_VERSION = NTASKBAR_MSG + 1;
NTASKBAR_DIRECTORY = NTASKBAR_MSG + 2;
NTASKBAR_EXENAME = NTASKBAR_MSG + 3;
NTASKBAR_REGIST = NTASKBAR_MSG + 4;
NTASKBAR_QUIT = NTASKBAR_MSG + 5;
NTASKBAR_SETFILER = NTASKBAR_MSG + 6;
NTASKBAR_GETFILER = NTASKBAR_MSG + 7;
NTASKBAR_BLINK = NTASKBAR_MSG + 8;
NTASKBAR_ADDON_INSTALL = NTASKBAR_MSG + 40;
NTASKBAR_ADDON_UNINSTALL= NTASKBAR_MSG + 41;
NTASKBAR_ADDON_TITLE = NTASKBAR_MSG + 42;
NTASKBAR_ADDON_COPYRIGHT= NTASKBAR_MSG + 43;
NTASKBAR_BTN_CREATE = NTASKBAR_MSG + 50;
NTASKBAR_BTN_REMOVE = NTASKBAR_MSG + 51;
NTASKBAR_BTN_CLICK = NTASKBAR_MSG + 52;
NTASKBAR_BTN_RCLICK = NTASKBAR_MSG + 53;
NTASKBAR_BTN_DROPFILE = NTASKBAR_MSG + 54;
NTASKBAR_BTN_SETICON = NTASKBAR_MSG + 55;
NTASKBAR_BTN_GETICON = NTASKBAR_MSG + 56;
NTASKBAR_BTN_SETHINT = NTASKBAR_MSG + 57;
NTASKBAR_BTN_GETHINT = NTASKBAR_MSG + 58;
NTASKBAR_BTN_DROPACCEPT = NTASKBAR_MSG + 59;
NTASKBAR_BTN_SETHEIGHT = NTASKBAR_MSG + 60;
NTASKBAR_BTN_GETHEIGHT = NTASKBAR_MSG + 61;
NTASKBAR_BTN_PAINT = NTASKBAR_MSG + 62;
NTASKBAR_BTN_DRAGACCEPT = NTASKBAR_MSG + 63;
NTASKBAR_BTN_SETVISIBLE = NTASKBAR_MSG + 64;
NTASKBAR_BTN_GETVISIBLE = NTASKBAR_MSG + 65;
NTASKBAR_BTN_MOUSEENTER = NTASKBAR_MSG + 66;
NTASKBAR_BTN_MOUSELEAVE = NTASKBAR_MSG + 67;
{***************************************************
***************************************************}
type
{$IFNDEF LPARAM}
LPARAM = Longint;
WPARAM = WORD;
UINT = Longint;
LRESULT = Longint;
{$ENDIF}
TNicoleDropFileEvent = procedure (Sender:TObject; FileName:string) of object;
TNicolePaintEvent = procedure (Sender:TObject; Canvas:TCanvas; Pushed:Boolean) of object;
TNicoleAddon = class(TComponent)
private
{ Private 宣言 }
FHint : string;
FHandle : HWND;
FIcon : TIcon;
FHeight : integer;
FDragAccept : Boolean;
FPopupMenu : TPopupMenu;
FVisible : Boolean;
FCopyright : String;
FOnClick : TNotifyEvent;
FOnDropFile : TNicoleDropFileEvent;
FOnPaint : TNicolePaintEvent;
FOnMouseEnter : TNotifyEvent;
FOnMouseLeave : TNotifyEvent;
function FGetNicoleTaskbar : HWND;
procedure FSetHint(theHint:string);
procedure FSetIcon(theIcon:TIcon);
procedure FSetHeight(theHeight:integer);
procedure FSetDragAccept(theDragAccept:Boolean);
procedure FSetVisible(theVisible:Boolean);
function FGetVersion : String;
function FGetDirectory : String;
function FGetExeName : String;
function FGetRegist : Boolean;
procedure FSetFiler(theFiler:String);
function FGetFiler : String;
procedure FSetCopyright(theCopyright:string);
protected
{ Protected 宣言 }
function GetAtom(theAtom:TATOM) : String; virtual;
function GetString(msg:Longint) : String; virtual;
function SendTaskBar(msg:UINT; wp:WPARAM; lp:LPARAM): LRESULT; virtual;
procedure PostTaskBar(msg:UINT; wp:WPARAM; lp:LPARAM); virtual;
procedure Loaded; override;
public
{ Public 宣言 }
constructor Create(theOwner:TComponent); override;
destructor Destroy; override;
procedure MessageHandler(var Msg: TMsg; var Handled: Boolean); virtual;
procedure Click; virtual;
procedure DropFile(filename:string); virtual;
procedure Paint(Pushed:Boolean); virtual;
procedure Blink(theBlink:Boolean; theIcon : TIcon); virtual;
function Install : integer;
function Uninstall : integer;
property Handle : HWND read FHandle;
property NicoleTaskBar : HWND read FGetNicoleTaskBar;
property Version : String read FGetVersion;
property Directory : String read FGetDirectory;
property ExeName : String read FGetExeName;
property Regist : Boolean read FGetRegist;
property Filer : String read FGetFiler write FSetFiler;
published
{ Published 宣言 }
property Hint : string read FHint write FSetHint;
property Icon : TIcon read FIcon write FSetIcon;
property Height : integer read FHeight write FSetHeight;
property DragAccept : Boolean read FDragAccept write FSetDragAccept;
property PopupMenu : TPopupMenu read FPopupMenu write FPopupMenu;
property Visible : Boolean read FVisible write FSetVisible;
property Copyright : String read FCopyright write FSetCopyright;
property OnClick : TNotifyEvent read FOnClick write FOnClick;
property OnDropFile : TNicoleDropFileEvent read FOnDropFile write FOnDropFile;
property OnPaint : TNicolePaintEvent read FOnPaint write FOnPaint;
property OnMouseEnter : TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave : TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end;
{***************************************************
***************************************************}
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Nicole', [TNicoleAddon]);
end;
{***************************************************
いっけん意味のないコードに見えますが
実は重要な意味があるので、省略しないでください
***************************************************}
procedure TNicoleAddon.Loaded;
begin
inherited Loaded;
Copyright := Copyright;
Icon := Icon;
end;
{***************************************************
インストールする
***************************************************}
function TNicoleAddon.Install : integer;
var
szTitle, szPath : array[0..256] of char;
begin
StrPCopy(szTitle, Application.Title);
StrPCopy(szPath, Application.ExeName);
Result := SendTaskBar(NTASKBAR_ADDON_INSTALL, GlobalAddAtom(szTitle), GlobalAddAtom(szPath));
end;
{***************************************************
アンインストールする
***************************************************}
function TNicoleAddon.Uninstall : integer;
var
szTitle : array[0..256] of char;
begin
StrPCopy(szTitle, Application.Title);
Result := SendTaskBar(NTASKBAR_ADDON_UNINSTALL, GlobalAddAtom(szTitle), 0);
end;
{***************************************************
アトムから文字列をStrig型として取り出し、アトムを削除する
***************************************************}
function TNicoleAddon.GetAtom(theAtom:TAtom) : string;
var
z : array[0..256] of char;
begin
GlobalGetAtomName(theAtom, z, 255);
GlobalDeleteAtom(theAtom);
Result := StrPas(z);
end;
{***************************************************
NICOLE TaskBarからのメッセージを処理する
通常は Application.OnMessage にセットして使うのが簡単です
***************************************************}
procedure TNicoleAddon.MessageHandler(var Msg: TMsg; var Handled: Boolean);
var
pt : TPoint;
begin
case msg.message of
NTASKBAR_BTN_CLICK:
begin
if Handle = msg.wParam then Click;
end;
NTASKBAR_BTN_RCLICK:
if (Handle = msg.wParam) and (nil <> PopupMenu) then begin
Application.MainForm.SetFocus;
GetCursorPos(pt);
PopupMenu.Popup(pt.x, pt.y);
end;
NTASKBAR_BTN_DROPFILE:
begin
if Handle = msg.wParam then DropFile(GetAtom(msg.lParam));
end;
NTASKBAR_BTN_PAINT:
begin
if Handle = msg.wParam then Paint(Boolean(msg.lParam));
end;
NTASKBAR_QUIT:
begin
Application.Terminate;
end;
NTASKBAR_BTN_MOUSEENTER:
begin
if (Handle = msg.wParam) and Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
end;
NTASKBAR_BTN_MOUSELEAVE:
begin
if (Handle = msg.wParam) and Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
end;
end;
end;
{***************************************************
コンストラクタ
***************************************************}
constructor TNicoleAddon.Create(theOwner:TComponent);
var
szTitle, szPath : array[0..256] of char;
begin
inherited Create(theOwner);
FIcon := TIcon.Create;
FHeight := 35;
FVisible := true;
if (theOwner is TForm) and not (csDesigning in theOwner.ComponentState) then begin
if 0 <> NicoleTaskBar then begin
FHandle := SendTaskBar(NTASKBAR_BTN_CREATE, Application.Handle, 0);
{Application.OnMessageに、自分のメッセージ処理メソッドを設定します
もし他の用途で Application.OnMessageを使っていたり
TNicoleAddonコンポーネントが複数ある場合には注意が必要です}
Application.OnMessage := MessageHandler;
StrPCopy(szTitle, Application.Title);
StrPCopy(szPath, Application.ExeName);
PostTaskBar(NTASKBAR_ADDON_TITLE, GlobalAddAtom(szTitle), GlobalAddAtom(szPath));
end else begin
{NICOLE TaskBarが起動されていないので、終了する}
ShowMessage('NICOLE TaskBarが起動されていません');
Application.Terminate;
end;
end;
end;
{***************************************************
デストラクタ
***************************************************}
destructor TNicoleAddon.Destroy;
begin
{NICOLE TaskBarへボタンを削除するメッセージを送る}
PostTaskBar(NTASKBAR_BTN_REMOVE, Handle, 0);
Blink(false, nil);
FIcon.Free;
Application.OnMessage := nil;
inherited Destroy;
end;
{***************************************************
OnClickにアタッチされたコードを呼び出す
***************************************************}
procedure TNicoleAddon.Click;
begin
if Assigned(FOnClick) then FOnClick(Self);
end;
{***************************************************
OnDropFileにアタッチされたコードを呼び出す
***************************************************}
procedure TNicoleAddon.DropFile(filename:string);
begin
if Assigned(FOnDropFile) then FOnDropFile(Self, filename);
end;
{***************************************************
OnPaintにアタッチされたコードを呼び出す
***************************************************}
procedure TNicoleAddon.Paint(Pushed:Boolean);
var
canvas : TCanvas;
begin
{NICOLE TaskBarに何らかのエラーにより
アドオンのボタンが作成されていなければ何もしない}
if 0 = Handle then exit;
if Assigned(FOnPaint) then begin
Canvas := TCanvas.Create;
Canvas.Handle := GetDC(Handle);
Canvas.Font := Application.MainForm.Font;
Canvas.Font.Color := clBtnText;
Canvas.Brush.Color := clBtnFace;
FOnPaint(Self, canvas, Pushed);
ReleaseDC(Handle, Canvas.Handle);
Canvas.Free;
end;
end;
{***************************************************
NicoleTaskBarプロパティの読み出し
***************************************************}
function TNicoleAddon.FGetNicoleTaskBar : HWND;
var
window : HWND;
begin
window := FindWindow('TNICOLE_TaskBar', 'NICOLE TaskBar');
Result := window;
end;
{***************************************************
NICOLE TaskBar へアドオンのメッセージを送る
***************************************************}
function TNicoleAddon.SendTaskBar(msg:UINT; wp:WPARAM; lp:LPARAM) : LRESULT;
begin
if 0 = NicoleTaskBar then begin
Result := 0;
exit;
end;
Result := SendMessage(NicoleTaskBar, msg, wp, lp);
end;
procedure TNicoleAddon.PostTaskBar(msg:UINT; wp:WPARAM; lp:LPARAM);
begin
if 0 = NicoleTaskBar then exit;
PostMessage(NicoleTaskBar, msg, wp, lp);
end;
{***************************************************
Hint プロパティへの書き込み
***************************************************}
procedure TNicoleAddon.FSetHint(theHint:string);
var
z : array[0..256] of char;
begin
{下のコードはPCharへのキャストを使えば簡単ですが、一応Delphi1.0でも
コンパイルできるようにわざと、このようにコーティングしています}
FHint := theHint;
StrPCopy(z, theHint);
PostTaskBar(NTASKBAR_BTN_SETHINT, Handle, GlobalAddAtom(z));
end;
{***************************************************
Iconプロパティへの書き込み
***************************************************}
procedure TNicoleAddon.FSetIcon(theIcon:TIcon);
begin
FIcon.Assign(theIcon);
{実際にはアイコンハンドル(HICON)をメッセージで送る}
PostTaskBar(NTASKBAR_BTN_SETICON, Handle, Icon.Handle);
end;
{***************************************************
Heightプロパティへの書き込み
***************************************************}
procedure TNicoleAddon.FSetHeight(theHeight:integer);
begin
if theHeight < 1 then theHeight := 1;
FHeight := theHeight;
PostTaskBar(NTASKBAR_BTN_SETHEIGHT, Handle, Height);
end;
{***************************************************
DragAcceptプロパティへの書き込み
***************************************************}
procedure TNicoleAddon.FSetDragAccept(theDragAccept:Boolean);
begin
FDragAccept := theDragAccept;
PostTaskBar(NTASKBAR_BTN_DRAGACCEPT, Handle, LPARAM(DragAccept));
end;
{***************************************************
Visibleプロパティへの書き込み
***************************************************}
procedure TNicoleAddon.FSetVisible(theVisible:Boolean);
begin
FVisible := theVisible;
PostTaskBar(NTASKBAR_BTN_SETVISIBLE, Handle, LPARAM(theVisible));
end;
{***************************************************
Registプロパティの読込
***************************************************}
function TNicoleAddon.FGetRegist : Boolean;
begin
Result := Boolean(SendTaskBar(NTASKBAR_REGIST, 0, 0));
end;
{***************************************************************
* 文字列を返すメッセージを簡単に処理するルーチン
***************************************************************}
function TNicoleAddon.GetString(msg:Longint) : String;
var
theAtom : TATOM;
begin
theAtom := SendTaskBar(msg, 0, 0);
Result := GetAtom(theAtom);
end;
{***************************************************************
* Versionプロパティの読み出し
***************************************************************}
function TNicoleAddon.FGetVersion : String;
begin
Result := GetString(NTASKBAR_VERSION);
end;
{***************************************************************
* ExeNameプロパティの読み出し
***************************************************************}
function TNicoleAddon.FGetExeName : String;
begin
Result := GetString(NTASKBAR_EXENAME);
end;
{***************************************************************
* Directoryプロパティの読み出し
***************************************************************}
function TNicoleAddon.FGetDirectory : String;
begin
Result := GetString(NTASKBAR_DIRECTORY);
end;
{***************************************************************
* Filerプロパティの読み出し
***************************************************************}
function TNicoleAddon.FGetFiler : String;
begin
Result := GetString(NTASKBAR_GETFILER);
end;
{***************************************************************
* Filerプロパティへの書き込み
***************************************************************}
procedure TNicoleAddon.FSetFiler(theFiler:String);
var
z : array[0..256] of char;
begin
StrPCopy(z, theFiler);
PostTaskBar(NTASKBAR_SETFILER, 0, GlobalAddAtom(z));
end;
{***************************************************************
* Copyrightプロパティへの書き込み
***************************************************************}
procedure TNicoleAddon.FSetCopyright(theCopyright:String);
var
szTitle, szCopyright : array[0..256] of char;
begin
FCopyright := theCopyright;
StrPCopy(szTitle, Application.Title);
StrPCopy(szCopyright, Copyright);
PostTaskBar(NTASKBAR_ADDON_COPYRIGHT, GlobalAddAtom(szTitle), GlobalAddAtom(szCopyright));
end;
procedure TNicoleAddon.Blink( theBlink:Boolean; theIcon:TIcon);
begin
if nil = theIcon then begin
PostTaskBar(NTASKBAR_BLINK, WPARAM(theBlink), 0);
end else begin
PostTaskBar(NTASKBAR_BLINK, WPARAM(theBlink), theIcon.Handle);
end;
end;
end.