窗体不在任务栏显示

iamduo 2014-04-22 07:03:51
我有几个窗体创建自 DLL。
DLL 中窗体会显示在任务栏上。
我查了网上最靠谱的做法是
SetWindowLong(hForm,GWL_EXSTYLE,WS_EX_TOOLWINDOW);

但是,我这个窗体本身不是Dialog,是有最大化,最小化按钮的 bsSizeable
有没有什么做法,即可以不显示在任务栏,又保持原本的风格?
...全文
321 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ktb2007 2014-04-24
  • 打赏
  • 举报
回复
测试一下看那看那
iamduo 2014-04-23
  • 打赏
  • 举报
回复
谢谢大家。 事情其实是这样的。 我有 2 个 dll(A,B),1 个主程序(E)。 1. A 是界面 DLL,B 是Socket DLL。 2. E 调用 A 中的界面。 3. A 中有个按钮,会调用 B 中连接 Socket 的方法。 4. B 中,如果连接失败(反馈 10061),我会尝试 3 次重连,每次间隔 1 秒。 5. 只要出发这个 Sleep,就会产生空白任务栏。 原因大概吧,就是 2 个 DLL 中有两套 Application。 最终,我貌似是解决了。 在 B 中写法如下: repeat if 连接错误 then begin Application.ProcessMessages; Sleep(1000); end; until 尝试完成;
lght 2014-04-23
  • 打赏
  • 举报
回复
dll中不能用application创建窗体,要用窗口类构造函数创建
金卯刀 2014-04-23
  • 打赏
  • 举报
回复
引用 4 楼 iamduo 的回复:
[quote=引用 1 楼 wr960204 的回复:] 设置你DLL种Application的Handle为主程序的某个窗口句柄,例如Application.Handle
武稀松? 拜读过您的部分博文。 受益匪浅,非常感谢。 对于您说的方法,我开始就是这么做的。 1. 保存 Dll App.Handle 2. 用 exe App.Handle 赋值 Dll App.Handle 3. 使用。。。 4. 归还 Dll App.Handle。(释放 Dll 前) 原本用的好好的。 不过,也不清楚是哪里出的问题。 当调用 MessageBox (第一个参数,就是 Dll Form. Handle)之后, 有一半的几率,会出现一个没有文字的框,在任务栏里。多出来的,与主程序并存。 特别是 exception 的时候,出现率高。 关闭它,也会跟主程序的那个框,一样。会关闭程序。 只有当任务栏里,存在一个 Dll Form 的标题框时,同样的代码,不会增加这个无文字的框。 Win7 64 位 + Delphi 2007 [/quote] 从描述的状况看,dll弹出窗口会提交退出程序消息(WM_QUIT)。窗口应该是调用了application.Terminate,提交了该消息。 VCL窗体内部处理,除非是主窗口,否则不会调用方法。可以先确认一下以下两个问题: 1、在Application.Terminate设置断点,出现问题时,分析栈:看谁调用? 2、dll中的窗口是如何创建?application.CreateForm?注意其中FMainForm及MainFormOnTaskBar的处理。
lght 2014-04-23
  • 打赏
  • 举报
回复
引用 8 楼 iamduo 的回复:
谢谢大家。 事情其实是这样的。 我有 2 个 dll(A,B),1 个主程序(E)。 1. A 是界面 DLL,B 是Socket DLL。 2. E 调用 A 中的界面。 3. A 中有个按钮,会调用 B 中连接 Socket 的方法。 4. B 中,如果连接失败(反馈 10061),我会尝试 3 次重连,每次间隔 1 秒。 5. 只要出发这个 Sleep,就会产生空白任务栏。 原因大概吧,就是 2 个 DLL 中有两套 Application。 最终,我貌似是解决了。 在 B 中写法如下: repeat if 连接错误 then begin Application.ProcessMessages; Sleep(1000); end; until 尝试完成;
为什么不在A中sleep? 调用b中socket连接,失败返回,a中循环sleep三次错误后退出
金卯刀 2014-04-23
  • 打赏
  • 举报
回复
引用 8 楼 iamduo 的回复:
谢谢大家。 事情其实是这样的。 我有 2 个 dll(A,B),1 个主程序(E)。 1. A 是界面 DLL,B 是Socket DLL。 2. E 调用 A 中的界面。 3. A 中有个按钮,会调用 B 中连接 Socket 的方法。 4. B 中,如果连接失败(反馈 10061),我会尝试 3 次重连,每次间隔 1 秒。 5. 只要出发这个 Sleep,就会产生空白任务栏。 原因大概吧,就是 2 个 DLL 中有两套 Application。 最终,我貌似是解决了。 在 B 中写法如下: repeat if 连接错误 then begin Application.ProcessMessages; Sleep(1000); end; until 尝试完成;
所以前面说明的关闭,其实是未正常退出(程序无响应)。你的改法,应该是在sleep前面加上Application.ProcessMessages;? 不论怎样,sleep太久又未做处理,确实会造成“程序死掉”的现象。
iamduo 2014-04-22
  • 打赏
  • 举报
回复
好吧。我知道错误的地方。 但是,还不知道怎么解决。 在 Dll 中,Form 上有一个按钮,触发的事件当中,有一句 Sleep(1000) 把这个注释掉,就ok了。
iamduo 2014-04-22
  • 打赏
  • 举报
回复
引用 1 楼 wr960204 的回复:
设置你DLL种Application的Handle为主程序的某个窗口句柄,例如Application.Handle
武稀松? 拜读过您的部分博文。 受益匪浅,非常感谢。 对于您说的方法,我开始就是这么做的。 1. 保存 Dll App.Handle 2. 用 exe App.Handle 赋值 Dll App.Handle 3. 使用。。。 4. 归还 Dll App.Handle。(释放 Dll 前) 原本用的好好的。 不过,也不清楚是哪里出的问题。 当调用 MessageBox (第一个参数,就是 Dll Form. Handle)之后, 有一半的几率,会出现一个没有文字的框,在任务栏里。多出来的,与主程序并存。 特别是 exception 的时候,出现率高。 关闭它,也会跟主程序的那个框,一样。会关闭程序。 只有当任务栏里,存在一个 Dll Form 的标题框时,同样的代码,不会增加这个无文字的框。 Win7 64 位 + Delphi 2007
iamduo 2014-04-22
  • 打赏
  • 举报
回复
引用 2 楼 JPEXE 的回复:
Application.ShowMainForm := False; Application.MainFormOnTaskBar := False;
这个是针对 exe 的。跟 dll form 无关。 谢谢。
JPEXE 2014-04-22
  • 打赏
  • 举报
回复
Application.ShowMainForm := False; Application.MainFormOnTaskBar := False;
武稀松 2014-04-22
  • 打赏
  • 举报
回复
设置你DLL种Application的Handle为主程序的某个窗口句柄,例如Application.Handle

5,386

社区成员

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

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