ag旗舰厅官网_ag旗舰厅下载客户端

热门关键词: ag旗舰厅官网,ag旗舰厅下载客户端

计算机网络

当前位置:ag旗舰厅官网 > 计算机网络 > 监视剪贴板内容,任务栏中的托盘程序设计

监视剪贴板内容,任务栏中的托盘程序设计

来源:http://www.pedaLyourcycLe.com 作者:ag旗舰厅官网 时间:2019-11-12 04:58

冲浪的年代,用过网络蚂蚁的人肯定不少,其中一项监视剪贴板变化的功能让人感觉到不少体贴。本文将介绍在Delphi中如何使用“体贴板”,来丰富自己的软件功能。


Windows使用剪贴板观察器和观察链。剪贴板观察器是一个显示剪贴板当前内容的窗口。通常它应该至少能显示三种普通格式的内容:文字CF_TEXT、位图CF_BITMAP、元文件CF_METAFILEPICT。剪贴板观察链是一系列相互独立的剪贴板观察窗口,它们都能够接受当前发送到剪贴板的内容。我们大致按照以下步骤在窗口中处理有关剪贴板的内容。

 

首先,使用SetClipboardViewer(HWND)函数向剪贴板观察链中加入一个观察窗口。当剪贴板的内容发生变化时,该窗口会接收到一个WM_DRAWCLIPBOARD消息。该函数需要传递的参数是观察窗口的句柄。返回值也是一个窗口句柄类型,标识了将要加入的下一个窗口。

 

然后,响应WM_DRAWCLIPBOARD消息处理剪贴板内容的变化。

 

最后,在程序退出或关闭时需要调用ChangeClipboardChain函数来将自己从观察链中删除。然后调用SendMessage函数把这些消息传递到观察链中的下一个观察窗口。函数ChangeClipboardChain原型如下:

  在我们平常设计项目时通常把一些常驻内存或使用频率比较高的程序做成托盘的形式,一来能使程序外观得到整洁性,二来能使程序更具专业性。
  在设计任务栏中的托盘程序时主要用到了一个WIN API函数Shell_NotifyIcon,大部分功能的实现都是在此函数基础上来实现的,该函数的原型如下: 
  WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage, // message identifier
PNOTIFYICONDATA pnid // pointer to structure
                     );
  通过看到参数我们知道要传递一个dwMessage消息参数的标识类型和一个指向具体修改信息的结构pnid,第一个参数的具体取值如下:
  dwMessage
  Identifier of the message to send. This parameter can be one of these values:
  NIM_ADD Adds an icon to the status area.{添加图标}
  NIM_DELETE Deletes an icon from the status area.{删除图标}
  NIM_MODIFY Modifies an icon in the status area. {修改图标}
  即为添加一个图标,删除一个图标和修改一个图标在任务栏的右部区域中。可以通过第一个参数的内容来定制对任务栏状态区的操作,第二个参数的具体取值如下:
  pnid
  Pointer to a NOTIFYICONDATA structure. The content of the structure depends on the value of dwMessage. 
  此参数为一个指向NOTIFYICONDATA结构的指针,通过这个结构来对设计者想要的操作进行定义,结构成员定义如下:
  typedef struct _NOTIFYICONDATA { // nid 
DWORD cbSize; {结构的大小}
HWND hWnd; {关联状态区图标的窗口句柄,用来处理回调函数}
UINT uID; {应用程序定义的状态区图标的标识符}
UINT uFlags; {此成员表明NOTIFYICONDATA记录中的成员uCallbackMessage、hIcon和szTip这三者的哪些项的值有效}
UINT uCallbackMessage; {程序定义的消息标识符,例如当鼠标在状态区图标上移动或者左右点击所发生的事情时,操作系统将向Wnd指定的那个窗口发送uCallbackMessage消息。在uCallbackMessage消息中,lParam参数包含了Windows的鼠标消息的类型,而wParam参数则包含了图标标识(即uID)。有效的鼠标消息包括以下几个:WM_LBUTTONDOWN、WM_RBUTTONDOWN、WM_MBUTTONDOWN、WM_LBUTTONUP、WM_RBUTTONUP、WM_MBUTTONUP、WM_MOUSEMOVE、WM_LBUTTONDBLCLK、WM_RBUTTONDBLCLK以及WM_MBUTTONDBLCLK。
}
HICON hIcon; {指定一个应用程序定义的图标的句柄}
char szTip[64];{在图标上显示的提示信息} 
  } NOTIFYICONDATA, *PNOTIFYICONDATA; 

BOOL ChangeClipboardChain(
HWND hWndRemove,    //将要删除的窗口的句柄
HWND hWndNewNext     //观察链中下一个窗口的句柄
  );    
Delphi的clipbrd.pas单元中定义了一个类TClipboard,它封装了Windows剪贴板,简化了大量复杂的处理过程。我们在程序中可以直接调用全局函数Clipboard,该函数用于返回TClipboard对象实例,使用这个实例对剪贴板进行剪切、复制和粘贴等操作。下面是TClipboard对象的几个常用的方法和属性的简单介绍。

  通过前面对Shell_NotifyIcon函数的基本认识,我们知道了具体的操作有添加,删除和修改图标,下面我们以一个实例来具体的去实现托盘程序的效果。 
  新建一个工程,然后放入ApplicationEvents1控件,在additional控件面板中,本例程带有弹出菜单功能。
  代码如下:
unit Unit1;

方法:

interface

Assign:将指定的对象放入剪贴板中。

uses
Windows,shellapi, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,AppEvnts, ImgList, Menus;
{一定要uses shellapi单元}
const
ghy_tray=wm_user+2;
type
TForm1 = class(TForm)
ImageList1: TImageList;
ApplicationEvents1: TApplicationEvents;
PopupMenu1: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
procedure ApplicationEvents1Minimize(Sender: TObject);
procedure ApplicationEvents1Restore(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
procedure WMSysCommand(var msg: TMessage);message wm_syscommand;
{ Private declarations }
public
procedure mytray(var Msg: TMessage); message ghy_tray;
{ Public declarations }
end;

Open:打开剪贴板,防止其他程序改写剪贴板。在向剪贴板加入多项数据时尤其有用。

var
Form1: TForm1;
tray1,tray2:TNotifyIconData;
ico1,ico2:ticon;
tags:boolean;
implementation

Close:关闭剪贴板。应该与打开剪贴板成对使用。

{$R *.DFM}
procedure Tform1.WMSysCommand(var msg: TMessage);
begin
if msg.WParam = SC_MINIMIZE then
begin
showwindow(application.handle,sw_hide);
inherited;
end
else
inherited;
end;

Clear:清空剪贴板。

procedure tform1.mytray(var Msg: TMessage);
var
pt:tpoint;
begin
GetCursorPos(pt);

GetAsHandle:返回剪贴板中指定格式数据的句柄。使用前必须打开剪贴板。

case msg.lParam of
WM_LBUTTONDOWN:
begin
//鼠标左键被按下
if tags=true then
begin
application.Minimize;
form1.Hide;
end
else
begin
application.Restore;
end;
end;

GetComponent:返回剪贴板中的一个控件。Delphi自己使用得多。

WM_LBUTTONUP:
begin
//释放鼠标左键
end;
wm_rbuttondown:
begin
//鼠标右键被按下
SetForegroundWindow(Form1.Handle);
form1.PopupMenu1.Popup(pt.x,pt.y);
end
else//调用父类的WndProc方法处理其它消息
inherited;
end;

HasFormat:查询剪贴板中是否有指定格式的内容。

end;

属性:

procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
tags:=false;
ShowWindow(Application.Handle,SW_HIDE);

AsText:用于读写剪贴板文字内容。

tray2.cbSize:=sizeof(tray2);
tray2.Wnd:=form1.Handle;
tray2.uID:=0;
tray2.uFlags:=NIF_ICON or NIF_TIP or NIF_MESSAGE;
tray2.uCallbackMessage:=ghy_tray;
tray2.hIcon:=ico2.Handle;
tray2.szTip:=’我的托盘程序’;
if not Shell_NotifyIcon(NIM_modify,@tray2) then
begin
ShowMessage(’no’);
end;
end;

FormatCount:读剪贴板中数据格式的种数。

procedure TForm1.ApplicationEvents1Restore(Sender: TObject);
begin
tags:=true;
form1.show;

Formats:返回剪贴板中各种格式的列表。

ico1:=ticon.Create;
ico2:=ticon.create;
imagelist1.GetIcon(0,ico1);
imagelist1.geticon(1,ico2);
tray1.cbSize:=sizeof(tray1);
tray1.Wnd:=form1.Handle;
tray1.uID:=0;
tray1.uFlags:=NIF_ICON or NIF_TIP or NIF_MESSAGE;
tray1.uCallbackMessage:=ghy_tray;
tray1.hIcon:=ico1.Handle;
tray1.szTip:=’我的托盘程序’;
if not Shell_NotifyIcon(NIM_modify,@tray1) then
begin
ShowMessage(’no’);
end;
end;

此外,Delphi中的许多控件中也封装了有关剪贴板处理的操作。下面的一个处理剪贴板的简单例子,只是将剪贴板的文字内容显示为窗口标题。

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ico1:=ticon.Create;
ico2:=ticon.create;
imagelist1.GetIcon(0,ico1);
imagelist1.geticon(1,ico2);
tray1.cbSize:=sizeof(tray1);
tray1.Wnd:=form1.Handle;
tray1.uID:=0;
tray1.uFlags:=NIF_ICON or NIF_TIP or NIF_MESSAGE;
tray1.uCallbackMessage:=ghy_tray;
tray1.hIcon:=ico1.Handle;
tray1.szTip:=’我的托盘程序’;
if not Shell_NotifyIcon(NIM_delete,@tray1) then
begin
ShowMessage(’no’);
end;

unit Unit1;

end;

interface

procedure TForm1.N1Click(Sender: TObject);
begin
showmessage(’you click open’);
end;

uses
  Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
  Clipbrd;//加入clipbrd单元

procedure TForm1.N2Click(Sender: TObject);
begin
showmessage(’you click save’);
end;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject;
var Action: TCloseAction);
  private
    { Private declarations }
  public
    NextClipHwnd:HWND;//观察链中下一个窗口句柄
procedure WMDrawClipBoard
(var AMessage:TMessage);
message WM_DRAWCLIPBOARD;
//处理WM_DRAWCLIPBOARD消息过程
  end;

procedure TForm1.N3Click(Sender: TObje

var
  Form1: TForm1;

...

implementation

相关文章

相关搜索:

今天看啥

搜索技术库

返回首页

  • 深入理解Java中的HashMap的实现原理,深入理解
  • Zookeeper 在Hadoop中的应用,zookeeperhadoop
  • 深入理解Java中的HashMap的实现原理
  • Android中的消息处理实例与分析
  • CSS实现定位元素居中的方法,css定位元素居中
  • 教你iOS信息聊天群如何添加新联系人

相关频道: Java编程  C#教程  C语言  C++教程  VC教程  Delphi教程  VB教程  工具软件  

{$R *.DFM}

{ TForm1 }

procedure TForm1.WMDrawClip
Board(var AMessage: TMessage);
begin
  //将WM_DRAWCLIPBOARD
消息传递到下一个观察链中的窗口
  SendMessage(NextClipHwnd,AMessage.
Msg,AMessage.WParam,AMessage.LParam);
  //查询剪贴板中特定格式的数据内容
  if (Clipboard.HasFormat(CF_TEXT) or
Clipboard.HasFormat(CF_OEMTEXT)) then
  begin
    //处理剪贴板中内容
    Caption:=Clipboard.asText;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //获得观察链中下一个窗口句柄
  NextClipHwnd:=SetClipBoardViewer(Handle);
end;

procedure TForm1.FormClose
(Sender: TObject; var Action: TCloseAction);
begin
  //从观察链中删除本观察窗口
  ChangeClipboardChain(Handle,NextClipHwnd);
  //将WM_DRAWCLIPBOARD
消息传递到下一个观察链中的窗口
  SendMessage(NextClipHwnd,WM_
CHANGECBCHAIN,Handle,NextClipHwnd);
end;

end.
需要注意的是,在处理剪贴板内容变化的消息WM_DRAWCLIPBOARD的过程和关闭窗口事件中使用函数sendmessage把WM_DRAWCLIPBOARD或WM_CHANGECBCHAIN消息传递到观察链中的下一个窗口是必要的,否则有可能其他窗口不能获得类似消息。另外,在使用网络蚂蚁时笔者曾经碰到不能设置剪贴板格式的情况,在此提醒读者注意检查RegisterClipboardFormat等函数的返回值。

本文由ag旗舰厅官网发布于计算机网络,转载请注明出处:监视剪贴板内容,任务栏中的托盘程序设计

关键词:

上一篇:c语言模拟达成oc引用计数

下一篇:没有了