yzhshi,千堆雪看过来。 (50分)

  • 主题发起人 主题发起人 zhaohai9
  • 开始时间 开始时间
Z

zhaohai9

Unregistered / Unconfirmed
GUEST, unregistred user!
如何得到某个应用程序在托盘上的ICON的handle?
 
天极网www.yesky.com的程序论坛有托盘编程的详细例子,它是vb的,可以转化为delphi的
 
大佬,找不到呀,给个连接吧!
 
先获得整个菜单条的handle,然后在获得最右边的那部分的handle,这个handle是包含两个
东西,一个是系统托盘区,一个是时间区域,就可以获得系统托盘的handle。然后,取得你
想要的图标的ICON还不是很容易吗?
 
yonge大侠:
; ;写一段看看好吗?
 
uses
; ;ShellAPI;
const
; ; ICON_ID = 1;
; ; MI_ICONEVENT = WM_USER + 1;
procedure TfrmMain.IconOnClick(var message: TMessage);
var
; ; p: TPoint;
begin
; ; if (message.LParam = WM_LBUTTONDOWN) then
; ; begin
; ; ; ; //自己要处理的代码。
; ; end;
; ; if ( message.LParam = WM_RBUTTONDOWN) then
; ; begin
; ; ; ; GetCursorPos(p);
; ; ; ; PopMain.Popup(p.x,p.y);
; ; end;
end;
//安装托盘图标
procedure TfrmMain.InstallIcon;
var
; ; IconData: TNotifyIconData;
begin
; ; sysTrayIcon:=TIcon.Create;
; ; sysTrayIcon:=Application.Icon;
; ; IconData.cbSize:=sizeof(IconData);
; ; IconData.Wnd:=Handle;
; ; IconData.uID:=ICON_ID;
; ; IconData.uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
; ; IconData.uCallbackMessage:=MI_ICONEVENT;
; ; IconData.hIcon:=sysTrayIcon.Handle;
; ; IconData.szTip:='FlapWinTool [Ver1.0]';
; ; Shell_NotifyIcon(NIM_ADD,@IconData);
end;
//卸载托盘图标
procedure TfrmMain.UnInstallIcon;
var
; ; IconData: TNotifyIconData;
begin
; ; IconData.cbSize:=sizeof(IconData);
; ; IconData.Wnd:=Handle;
; ; IconData.uID:=ICON_ID;
; ; Shell_NotifyIcon(NIM_DELETE,@IconData);
end;
 
大佬,我是想得到某个应用程序在托盘区的ICON句柄,列如金山词霸的托盘区ICON句柄
怎么得到?
 
你在折腾偶,本来想回去了,非叫我们过来,实话告诉你,我没做过呀。
帮你找找吧。[:)]
 
大侠,我真的觉得我们好象是非常好的朋友。
 
谈不上大侠,只是喜欢Delphi而已,还有,刚才找了一遭,什么都没发现、
静下来考虑一下,估计需要查找SysTray句柄,然后枚举其下面得子窗体,我实验一下吧。
希望成功,不成功的话就得等明天了。
对于朋友嘛,我觉得到这里来的都算的上是朋友!
 
好像时钟的那个ICON是来自TrayClockWClass,
而其他位于托盘区的ICON都是来自ToolBarWin32,
但是具体的句柄………………
等待yzhshi大侠的解答。
 
唉,忙碌了半天,得到一个时钟,还需要努力!
unit Unit1;

interface

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

type
; TForm1 = class(TForm)
; ; Button1: TButton;
; ; ListBox1: TListBox;
; ; ListBox2: TListBox;
; ; procedure Button1Click(Sender: TObject);
; private
; ; { Private declarations }
; public
; ; { Public declarations }
; end;

var
; Form1: TForm1;

implementation

{$R *.DFM}

function EnumChildWindowsProc(hwnd: Integer; lparam: Longint): Boolean; stdcall;
var
; buffer: array[0..255] of Char;
; szText: array[0..254] of char;

begin
; GetClassName(hwnd, buffer, 256);
; begin
; ; if GetWindowText(hwnd, @szText, 255) > 0 then
// ; ;GetWindowText(hwnd, @szText, 255);
; ; if (isWindow(hwnd) = True) then
; ; begin
; ; ; Form1.ListBox1.Items.Add(StrPas(@szText));
; ; ; Form1.ListBox2.Items.Add(StrPas(Buffer));
; ; end;


; ; Result := True; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; //终止循环
; end;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
; tray_Handle: THandle;
begin
; tray_Handle := FindWindow('Shell_TrayWnd', nil);
; ShowMessage(IntToStr(tray_Handle));
; EnumChildWindows(tray_Handle, @EnumChildWindowsProc, 0);
end;


end.
 
不错,确实有一个ToolBarWin32,不过好像没有找到它的子句柄,看来还需要努力呀!
这样注释就能够得到ToolBarWin32了
//if GetWindowText(hwnd, @szText, 255) > 0 then
; ; GetWindowText(hwnd, @szText, 255);
 
yzhshi:
你还记得那个vb的format函数吗?我找到delphi对应的了
label1.Caption:=format('%1.3d',[strtointdef(edit1.Text,1)]);
大侠不用糊涂,这个是上次你给我解答问题时的一个遗留问题。与
这次开贴无关。
 
这次两个大侠一起帮忙,嘿嘿,这个问题应该没问题了。
 
即使得到那个ICO的句柄,你也删不调他的。
你知道他的 IconData.uID 吗?
没有 uID ShellAPI 是不会允许你操作那个图标的。 [:D][:D][:D]
 
呵呵,OopsWare真是高人,连我要干什么都猜得到,你有什么办法没有,我是不是
瞎忙呀?
 
;uID 是 UINT; 类型, 循环试几亿次就差不多了 [:D][:D]
; 用VC++的Spy++, 或Borland的WinSign查一下窗口,不难得到窗口句柄,和Tray区域
句柄,ICO的是否可以得到就难讲了,另外Delphi提供的ShellAPI.pas定义太少了。
可以去查查较全的有关ShellAPI单元的定义,比如 MSDN,VC++的相关单元 。
; 懒的去查了....
 
喔赛!我可能要被yzhshi和千堆雪骂了。
 
呵呵,不会被骂的,技术问题嘛,大家一起努力,无论问题是否解决,我们都能够从中学到一些知识!
 
后退
顶部