关于托盘图标双击和单击的问题。

suny_2001 2002-04-02 10:48:12
加精
我有个托盘图标控件。当我用鼠标左键双击时,却无法避免触发单击事件。
我现在双击图标,然后老是弹出讨厌的单击时的菜单。
当双击时,就是 先 触发WM_LBUTTONDOWN 这个消息。无法避免。
然后再触发了WM_LBUTTONDBLCLK。

不知道有什么方法可以解决。就是双击时不会产生上述情况
...全文
479 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
suny_2001 2002-04-02
  • 打赏
  • 举报
回复
是的,谢谢,好象就是这句话
while ((gettickCount)<(CurrentTime+GetDoubleClickTime)) and (Mine.Tag=0) do
application.ProcessMessages;
就是判断2次点击的时间的间隔如果在双击范围内,那就application.ProcessMessages;//这句话应该是跳过的意思。
火鸟李国平 2002-04-02
  • 打赏
  • 举报
回复
API,强大有趣,无所不能,我喜欢!
互勉共进吧!
火鸟李国平 2002-04-02
  • 打赏
  • 举报
回复
对了,除写个循环外,你也可以用一个触发时间等于GetDoubleClickTime的时钟控件或用API SetTimer实现
火鸟李国平 2002-04-02
  • 打赏
  • 举报
回复
眼见为实,找到了代码,上半部分是对左右键四个事件的处理,下半部分是我的Trayicon代理的实现:
procedure Tmain.wndProc(var Msg: TMessage) ;//重载并自定义消息
var poss:TPoint;CurrentTime :longint;
Para:array [0..MAX_PATH] of char;
begin
GetCursorPos(Poss); //得到当前鼠标位置
with msg do
begin
if msg =wm_MyCall then
Begin
if WParam=0 then //这是程序的主图标消息
begin
CurrentTime:=gettickcount;//得到当前开机时间
case LParam of
WM_LBUTTONDBLCLK:
begin
Mine.Tag :=1;// 双击事件时不处理单击
MineClick(nil); //双击事件为窗口是否显示的切换
end;
wm_LButtonDown:
begin
Mine.Tag:=0;
while ((gettickCount)<(CurrentTime+GetDoubleClickTime)) and (Mine.Tag=0) do
application.ProcessMessages;
if Mine.Tag=0 then TrackPopupMenu(mn.handle,tpm_BottomAlign or tpm_RightAlign,Poss.X,Poss.Y,0,handle,nil);
//PopMenu(self);
// timClk.Enabled:=true;//将处理单击的时钟激活,到时处理单击
end;
WM_RBUTTONDBLCLK:
begin
//FowTimTimer(self);//如字符跟踪则将活动窗口Caption还原
Mine.Tag :=1;// 双击事件时不处理单击
MnexitClick(nil);
halt;
end;
wm_RButtonDown:
begin
Mine.Tag:=0;
while ((gettickCount)<(CurrentTime+GetDoubleClickTime)) and (Mine.Tag=0) do
application.ProcessMessages;
if Mine.Tag=0 then TrackPopupMenu(mnrun.handle,tpm_BottomAlign or tpm_RightAlign,Poss.X,Poss.Y,0,handle,nil);
end;
End;
end
else //这是程序表生成的图标消息
begin
case LParam of
wm_LButtonDown:
for CurrentTime:=0 to prglist.Items.Count-1 do
begin
if prglist.Items[CurrentTime].ImageIndex<>WParam-1 then continue;
N8Click(mnrun.Items[CurrentTime]);
break;
end;
wm_RButtonDown:shellabout(handle,Myname,'火鸟软件出品 RedBirdLi@263.net',application.icon.handle);
end;
end;
end
else
begin
if msg=ReCall then//这是由新运行的程序传来的,高字节是命令行及参数,低字节是长度
begin
if WParam>0 then
begin
//para:=strAlloc(LParam);
GlobalGetAtomName(WParam,@para,LParam);
GlobalDeleteAtom(WParam);
if (wordat(para,':2')=2) or (wordat(para,':2')=3) then messagebox(handle,'请先将运行中的超人关闭',myname,mb_ok+MB_ICONINFORMATION)
else
begin
//para:=pchar(copy(para,wordat(para,':2')-1,LParam));
//if filesafe(para) then FileOper(para,handle);
if main.icosva.Hint='' then
if filesafe(copy(para,wordat(para,':2')-1,LParam)) then
FileOper(copy(para,wordat(para,':2')-1,LParam),screen.ActiveForm.handle);
end;
//StrDispose(para);
end
else
begin
if top=-1000 then MineClick(Nil);
SetForegroundWindow(application.handle);
FlashWindow(handle,false);
delay(0.1);
FlashWindow(handle,true);
Refresh ;
end;
end;

case WParam of //WM_SYSCOMMAND
Hot_Lock:
fmlock.showmodal;
Hot_Key:
begin
if top=-1000 then MineClick(Nil);
SetForegroundWindow(application.handle);
Refresh ;
end;
SC_MINIMIZE:
begin
MineClick(self);
exit;
end;
{ SC_MAXIMIZE,SC_RESTORE:
begin
LogPopClick(TopOn);
exit;
end;}
end;
end;
end;
inherited wndProc(Msg); //继承
end;
suny_2001 2002-04-02
  • 打赏
  • 举报
回复
好的,谢谢 redbirdli(火鸟)
火鸟李国平 2002-04-02
  • 打赏
  • 举报
回复
代码一时不知放哪儿了,原理是这样的:
trayicon在你鼠标左键双击时会先收到一条WM_LButtonDown、
紧接着会收到WM_LBUTTONDBLCLK说明用户是双击而非单击
所以你在LButtonDown中的处理不应该是直接的单击处理,而是一个类似超时处理的循环,其时间长短会用到API GetDoubleClickTime(触发双击的最大时间间隔,再大了就是单击两次了),当已超时而未触发LBUTTONDBLCLK时说明真是单击,否则是因为双击而触发的,就只执行LBUTTONDBLCLK而不招待LButtonDown好了
火鸟李国平 2002-04-02
  • 打赏
  • 举报
回复
我的程序能实现左右键单双击共四个事件的处理: http://rbsky.myetang.com/SuperEx.exe,你先看着,我把代码给你抽出来,我记得当时实现时也折腾了好一会儿,实现后觉得很EZ了
4321 2002-04-02
  • 打赏
  • 举报
回复
就是左键单击事件啊,对了,是buttonclick事件,没有l啊
suny_2001 2002-04-02
  • 打赏
  • 举报
回复
wm_lbuttonclick 编译时说这个消息是没有的。没定义?
4321 2002-04-02
  • 打赏
  • 举报
回复
不要把单击事件写在wm_lbuttondown事件中,写在wm_lbuttonclick事件中
行空局域网屏幕监控简介: 1、本软件是为了网管员方便管理电脑之需而写,请别作其它非法用途。因使用此软件而产生的法律责任,本人一概不负! 2、本软件不是黑软,不跨网段不穿墙,使用时请注意防火墙设置。 3、不运行被控端,也可以扫描到网段内电脑上线情况,但不能进行屏幕控制。 4、被控端后台运行,且运行一次后,会随系统自动启动。并有进程防杀功能,较难下载,如确要删除请用主控端进行远程删除。 5、备注查看或添加请双左边的列表项。 功能介绍: 1、实时扫描:实时(每秒一次)扫描同一网段内上线电脑的IP和MAC,且扫描速度快(内核采用多线程,100台机以内瞬间完成)无任何卡机及停顿现象。 2、循环监控:对需监控的电脑进行循环截取屏幕缩略图。 3、单机监控:对单一电脑进行定时(1秒一次)截取屏幕缩略图。 4、单机全屏:对单一电脑进行全屏实时监控(一举一动尽在眼底)。 5、远程桌面:这个就不说啦,被控电脑的桌面、鼠标、键盘都是你的,“脱衣下裤”你看着办! 6、重启、关机:这个更不用说,点一下鼠标就搞定它。 7、远程修复:即主控端可以修复被控端由于某些特殊原因造成监控失败的问题。 8、远程下载被控端:被控端程序自启动后台运行,通常不能自行卸载删除(采用特殊手段除外),只能通过此主控端的远程卸载按钮才可以完全删除。 当前版本为1.21版,相对上一版本升级说明: 1、优化了代码,程序运行更加流畅。 2、主控端增加换肤功能。 3、增加了程序最小化到托盘图标。 4、修正了界面上的一个别字。
这款软件只能用在局域网的网络用户相互使用,版本没有注册不过也不会影相大家使用,不注册可以控制三个用户。本人自己使用过,非常简单好及,我用人格保证会用鼠标的人都会使用本软件,360安拦干截软件的安装请选择通过,我用360杀毒安装过程没有发现毒。其他杀毒软件有没有就不知道 了。请大家放心使用。人格保证!!!!好用。嘻嘻!!!! 局域网屏幕监控简介: 1、本软件是为了网管员方便管理电脑之需而写,请别作其它非法用途。因使用此软件而产生的法律责任,本人一概不负! 2、本软件不是黑软,不跨网段不穿墙,使用时请注意防火墙设置。 3、不运行被控端,也可以扫描到网段内电脑上线情况,但不能进行屏幕控制。 4、被控端后台运行,且运行一次后,会随系统自动启动。并有进程防杀功能,较难下载,如确要删除请用主控端进行远程删除。 5、备注查看或添加请双左边的列表项。 功能介绍: 1、实时扫描:实时(每秒一次)扫描同一网段内上线电脑的IP和MAC,且扫描速度快(内核采用多线程,100台机以内瞬间完成)无任何卡机及停顿现象。 2、循环监控:对需监控的电脑进行循环截取屏幕缩略图。 3、单机监控:对单一电脑进行定时(1秒一次)截取屏幕缩略图。 4、单机全屏:对单一电脑进行全屏实时监控(一举一动尽在眼底)。 5、远程桌面:这个就不说啦,被控电脑的桌面、鼠标、键盘都是你的,“脱衣下裤”你看着办! 6、重启、关机:这个更不用说,点一下鼠标就搞定它。 7、远程修复:即主控端可以修复被控端由于某些特殊原因造成监控失败的问题。 8、远程下载被控端:被控端程序自启动后台运行,通常不能自行卸载删除(采用特殊手段除外),只能通过此主控端的远程卸载按钮才可以完全删除。 当前版本为1.21版,相对上一版本升级说明: 1、优化了代码,程序运行更加流畅。 2、主控端增加换肤功能。 3、增加了程序最小化到托盘图标。 4、修正了界面上的一个别字。

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧