关于一个OnTop Form(悬浮)的问题?内详。。。。(50分)

  • 主题发起人 主题发起人 baifeng
  • 开始时间 开始时间
B

baifeng

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TScanCommForm.CreateParams(var Params:TCreateParams);
begin
inherited;
with Params do
begin
Style:=Params.Style xor WS_DLGFRAME;
WndParent:=0;
end;
end;
procedure TScanCommForm.FormCreate(Sender: TObject);
begin
Width:=180;
Height:=180;
SetWindowLong(Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
end;
属性formStyle:=fsStayOnTop

我通过以上方法将form悬浮,但出现一问题,我无法解决:
当其它窗体用ShowModal显示后,悬浮窗体虽然还是OnTop,但是会变成无效状态,
那么怎么在其它窗体ShowModal后,悬浮窗体依然是“活动”的?
 
试一下在onHide 事件中处理一下
 
to 黑影:能不能说详细一点,
 
其它窗体用Show而不用Showmodal;
 
to li_zhifu:呵呵,问题是我这里有的其它窗体肯定是用ShowModal,,
 
用ShowModal显示的窗体会禁止本应用程序的其它窗体
 
to li_zhifu:但网络蚂蚁的悬浮窗不知是怎么做的,好像另外???
 
悬浮窗用Show
 
一个建议,如此ShowModal你的窗体

var
WindowList: Pointer;
begin
WindowList := DisableTaskWindows(YouWantShowForm.Handle);
try
//YouWantShowForm.Create(Application);//如果无须创建
YouWantShowForm.Show;
//干你想干的。
finally
EnableTaskWindows(WindowList);
YouWantShowForm.Close;//or YouWantShowForm.Hide;

 
设置FormStyle:=fsStayOnTop
 
procedure TForm1.CMEraseBkgnd(var Message:TWMEraseBkgnd);
begin
SetWindowPos(Form1.handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE Or SWP_NOMOVE);
//使窗口总处于桌面最上层
inherited;
end;
我一直都这么用的,很不错的!
 
我用Spy++看了它们的不同,FlashGet浮动窗口的Parent为nil,而用以上方法创建的窗口Parent
不为nil,
谁有办法使创建的窗口的Parent为nil,可能就行了!
 
to 浦欣,我来一试
 
把悬浮窗做在一个Dll里,或者做成一个独立的应用程序。
 
做成DLL与主程序的交互就不方便了,而且FlashGet并没有写到DLL中,说明一定可以实现.

Delphi程序员主要的缺点就是对Windows底层东西了解太少,估计让一个写VC的很容易就写
出来了!!!
要不,为什么现在招Delphi的越来越少了!大家要努力哦!(我自己也要努力!),不然以后我们
就没饭吃了!!!!!!!!!!
 
拷,我想总有办法的,,,,

只是俺对api不熟
 
private
{ Private declarations }
//创建拖放窗口
procedure Createparams(Var Params:TCreateParams);override;
//拖放窗口的移动
procedure WMNCHitTest( var Msg : TWMNCHitTest );message wm_NCHitTest;
………………
//在窗口上按下鼠标移动窗口
procedure TfrmDarg.WMNCHitTest( var Msg : TWMNCHitTest );
begin
if GetAsyncKeyState(VK_LButton) < 0 then
Msg.Result := HTCaption
else
Msg.Result := HTCLient;
end;
//创建窗口
procedure TfrmDarg.Createparams(var Params:TCreateParams);
begin
Inherited CreateParams(Params);
With Params do
begin
//Width:=40;
//Height:=40;
Style :=WS_CAPTION;
Style :=WS_POPUP;
EXStyle:=ExStyle or WS_EX_TOPMOST;// OR WS_EX_ACCEPTFILES or WS_DLGFRAME or WM_NCHITTEST;
WndParent:=GetDeskTopWindow();
end;
end;
 
在使用WndParent:=GetDesktopWindow()后,我用Spy++查看的结果
(其中Extended Styles均相同)
FlashGet:
Window Styles:
WS_POPUP WS_VISIBLE WS_CLIPSIBLINGS WS_OVERLAPPED

Custom Form:(普通情况)
Window Styles:
WS_POPUP WS_VISIBLE WS_CLIPSIBLINGS WS_OVERLAPPED
Custom Form:(当主窗体中有ShowModal的窗体时)
Window Styles:
WS_POPUP WS_VISIBLE WS_DISABLED WS_CLIPSIBLINGS WS_OVERLAPPED
也就是说当主窗体ShowModal其它窗体时,将这个窗体设为Disabled,而FlashGet就没这个问题
问题就在这儿!
 
FlatForm = TFlatForm.Create(nil);
 
参见 http://www.delphibbs.com/delphibbs/dispq.asp?lid=1559548

悬浮窗口对WM_ENABLE消息进行处理,当一个窗体的enabled改变时,windows会给他发这条消息
private
procedure EnableChanged(var Msg: TMessage); message WM_ENABLE;
.....
implementation
procedure TLittlebox.EnableChanged(var Msg: TMessage);
begin
EnableWindow(handle, true);
inherited;
end;

这样很快很方便的搞定! [:)]
 
后退
顶部