诚信求教一个难题,望各位高手解答

jixiaohai 2012-01-24 12:21:44
普通窗体点击任务栏上的小图标会缩小到任务栏。再点击会还原出来。。问题来了
在窗体样式是bsNone的情况下 点任务栏上的按钮,并不能将窗口缩回到任务栏。

分不是很多,希望各路高手帮指点下哈!
...全文
197 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
代码跳动 2012-02-06
  • 打赏
  • 举报
回复
就是要判断焦点的问题,因为我只是判断了消息, 有焦点就会有消息, 要检测消息来源,觉得越搞越复杂了,换个方式,不用bsNone,然后再处理问题。
jixiaohai 2012-02-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhangqiwen 的回复:]

应该楼主自己没去试,在等直接的结果,我反汇编看了下依然也只能消息,而且比较多不好判断,后面一想,直接测试不是来的更快,因此下面注释的是测试前的,逐个排除后得到下面结果, 只需按以前代码改这个消息函数即可。
procedure TForm1.OnAppMessage(var Msg: TMsg; var Handled: Boolean);
begin
if //(Msg.messag……
[/Quote]

你这个方法试过了。xp下没测试。。win7下测试的。出现以下问题。
1、有时候点一下无法缩小。需要点好几下才能缩小
2、当我点任务栏里别的程序缩小的时候。这个程序也会跟着缩小。。

哎。能力有限。只能暂时放下这个功能最后再去研究了。还是谢谢zhangqiwen的提点。
代码跳动 2012-02-03
  • 打赏
  • 举报
回复
应该楼主自己没去试,在等直接的结果,我反汇编看了下依然也只能消息,而且比较多不好判断,后面一想,直接测试不是来的更快,因此下面注释的是测试前的,逐个排除后得到下面结果, 只需按以前代码改这个消息函数即可。
procedure TForm1.OnAppMessage(var Msg: TMsg; var Handled: Boolean);
begin
if //(Msg.message >0 )
// and((Msg.message <>49214 )) //要查是什么消息,因为一直断所以排除
//and((Msg.message <>15 )) //要查是什么消息,因为一直断所以排除
// and((Msg.message <>275 )) //要查是什么消息,因为一直断所以排除
// and((Msg.message <>45057 )) //好像是失去焦点
((Msg.message =45056 )) //好想是得到焦点,换成十六进制$b000,可以查消息api
then
begin
// ShowMessage(IntToStr(Msg.message));
Handled := True;
Application.Minimize; //程序最小化,
//到此已经完成点击最小话,但要判断是任务栏获取焦点还是数遍点击窗口
//所以还需要在窗体上最判断. 需要自己测试下。
end;
end;
lijin1230 2012-02-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhangqiwen 的回复:]
private
{ Private declarations }
procedure OnAppMessage(var Msg: TMsg; var Handled: Boolean);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm……
[/Quote] +1
jixiaohai 2012-01-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kaikai_kk 的回复:]

不是吧
我的XP+D7的任意设置BorderStyle,点击任务栏都很会最小化及还原
你做了其它处理了么?
[/Quote]
我没有做任何的处理。就是一个空窗体设置为bsnone也是这样的效果。。我是win7系统+delphi2010
kaikai_kk 2012-01-30
  • 打赏
  • 举报
回复
不是吧
我的XP+D7的任意设置BorderStyle,点击任务栏都很会最小化及还原
你做了其它处理了么?
代码跳动 2012-01-29
  • 打赏
  • 举报
回复
private
{ Private declarations }
procedure OnAppMessage(var Msg: TMsg; var Handled: Boolean);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.OnAppMessage(var Msg: TMsg; var Handled: Boolean);
begin
if (Msg.message = WM_ACTIVATE ) and (Msg.wParam = SC_ICON) then
begin
ShowMessage( 拦截最小化消息!');
Handled := True;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage:= OnAppMessage;
end;

当窗口风格bsSingle窗口的时候点击状态栏会激活最小化消息。
但bsnone的时候,是不会触发这些消息,因此主要是找到应该拦截那一个消息,我没找到,反调试也没得到结果,只看到上层有个USER32.WaitMessage。 抛砖引玉吧。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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