如何解决窗体不能最小化的问题(50分)

  • 主题发起人 主题发起人 freddyzhu
  • 开始时间 开始时间
F

freddyzhu

Unregistered / Unconfirmed
GUEST, unregistred user!
我为了实现"让一个程序不能加载两次"且如果该程序已运行则自动将该程序激活且让用户能<br>直接开到。<br>遇到一个问题:当我再次运行时,该程序不再得载且显示在最前面,<br>但最小化失效其它正常(但我能通过form.WindowState := wsMinimized来实现最小化)<br>不知各位可曾遇到过,可有良策,请赐教。
 
if IsIconic(AppWnd) then &nbsp;//如果窗體最小化<br>&nbsp; &nbsp;ShowWindow(Appwnd,SW_RESTORE) //恢復到原來的樣子<br>else<br>&nbsp; &nbsp;SetForegroundWindow(AppWnd);//否則到最前面來<br>你問的是這個意思嗎﹖你打了好多錯字在上面﹐害得我看不太懂。
 
to dadabox:<br>&nbsp; &nbsp; 不好意思,你可能没明白我的意思,<br>“我能让窗体显示在最前面但没法解决最小化的问题”<br>你说的方法我都试过,不行。<br>&nbsp; &nbsp; 下面是我试过的一些api都不能解决该问题。<br>// &nbsp; &nbsp;setWindowPos(FindHandle,HWND_TOPMOST,0,0,SCREEN.WIDTH,SCREEN.HEIGHT,<br>// &nbsp;SWP_SHOWWINDOW);<br>// &nbsp; &nbsp;SetWindowPos (FindHandle, HWND_TOPMost,<br>// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0, 0, 0, 0, <br>// &nbsp;SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW);<br>// &nbsp;SetWindowPos (FindHandle, HWND_NOTOPMOST,<br>// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0, 0, 0, 0, <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW);<br>// &nbsp; &nbsp;ShowWindow(FindHandle,SW_Restore);<br>// &nbsp; &nbsp; &nbsp;Application.BringToFront;<br>// &nbsp; &nbsp;SetForegroundWindow(FindHandle);<br>// &nbsp; &nbsp;SetActiveWindow(FindHandle);<br>// &nbsp; &nbsp; sendmessage(Findhandle,wm_syscommand,sc_restore,0);<br>// &nbsp; &nbsp;BringWindowToTop(FindHandle);<br>// &nbsp; &nbsp;enableWindow(FindHandle, True);<br>
 
这个问题很有意思,我碰到过,确实是不能最小化了,不过忘了怎样解决的了<br>SetForegroundWindow(AppWnd);//否則到最前面來<br>这句话在98下是好用的,在W2k就不好用了<br>
 
To SS2000:<br>&nbsp; &nbsp;我是在win2000下开发的确实如此,但win98下我还没试过。
 
To SS2000:<br>&nbsp; &nbsp; 我刚在win98下试了,也不行。<br>
 
&nbsp;这是个老问题了。<br>&nbsp; 最小化失效是因为WINDOWS认为此窗口已经最小化了,我们在程序再次运行时已经<br>把它恢复了,但WINDOWS并不知道,还是认为它是最小化的。<br>&nbsp; 解决的办法一般是发消息给那个第一次启动的窗口,而不是调用ShowWindow。
 
不能最小化,与你把程序激活到最前面的方式有关,也就是说,你要根据不同的情况,采用<br>不同的方法激活前一个实例,最好的办法比较复杂,简单的说,就是你要知道已经有一个实<br>例在运行,然后通知前一个实例,让他“自己”把自己放到最前面
 
具体点最好来点实例<br>
 
同意Huzzz!
 
呵呵,贴个好用的代码给你<br>//加在初始化过程中<br>var<br>handle:HWND;<br>begin<br>application.initialize;<br>handle:=findwindow('tform1','form1');<br>if handle&lt;&gt;0 then<br>begin<br>setforegroundwindow(handle);<br>application.terminate;<br>end;<br>application.createform(tform1.form1);<br>application.run;<br>end;
 
贴一篇文章:<br><br>避免二次运行 &nbsp;<br>实现单实例运行的关键是判断前一实例是否存在,Win3.x中运行的程序能获<br>知前一实例的句柄,从而可以方便地进行判断,但 Windows 95 是抢先式多<br>任务系统,其程序的前一实例句柄恒为零,所以只有另寻其他办法。目前最<br>有效的办法是通过查看是否有相同窗口类名的例程存在来进行判断。下面介<br>绍在Delphi中实现的方法。 <br>1、对主窗口程序的改动:<br><br>在主窗口(即程序创建的第一个窗口)中interface节加入<br>const<br>CM_RESTORE = WM_USER + $1000; {自定义的“恢复”消息}<br>MYAPPNAME = "My Delphi Program";<br>并在Form的定义的public节中加入<br>procedure CreateParams(var Params: TCreateParams); override;<br>Procedure RestoreRequest(var message: Tmessage); message CM_RESTORE;<br>在implementation节中加入<br>{指定窗口名称}<br><br> <br><br>procedure TForm1.CreateParams(var Params: TCreateParams);<br>begin<br>inherited CreateParams(Params);<br>Params.WinClassName := MYAPPNAME;<br>end;<br><br>{处理“恢复”消息}<br><br>procedure TForm1.RestoreRequest(var message: Tmessage);<br>begin<br>if IsIconic(Application.Handle) = TRUE then<br>Application.Restore<br>else<br>Application.BringToFront;<br>end;<br>经过以上修改,程序的主窗口的类名已经被指定了,这是进行判断的基础。一般<br>在程序刚开始运行的时候进行判断,所以还要对DPR文件进行修改。<br><br>2、对DPR文件的改动<br><br>在 uses 节中添加 windows、messages这两个单元加入下列语句,注意两个文件<br>中常量CM_RESTORE和MYAPPNAME的定义必须一致<br>const<br>CM_RESTORE = WM_USER + $1000; {自定义的“恢复”消息}<br>MYAPPNAME = "My Delphi Program";<br>var<br>RvHandle : hWnd;<br>将下列语句插到程序最前部(在Application.Initialize之前)<br>RvHandle := FindWindow(MYAPPNAME, NIL);<br>if RvHandle &gt; 0 then<br>begin<br>PostMessage(RvHandle, CM_RESTORE, 0, 0);<br>Exit;<br>end;<br><br>这段程序的意思是如果找到一个类名相同的窗口,则向该窗口发送一个消<br>息,并退出,而本例中原窗口收到该消息后会自动激活或从图标还原,从<br>而达到了避免二次运行且能自动调出前一例程的目的。<br>&nbsp;<br><br>HUZZZ的说明:我并不喜欢这种实现,事实上,判断是否有实例运行要通过<br>创建互斥体(CreateMutex)进行,而恢复的消息一般是进行广播。
 
To 苦虫, <br>&nbsp; 我试了你的方法,虽然能实现最小化,可是好像不能实现将窗体显示在最上方<br>测试结果是这样的 <br>&nbsp; 我首先将窗口最小化,再第二次执行该程序,<br>但窗口一闪又变成了最小化<br><br>To:Huzzz, <br>&nbsp; 你试过没有,我试了一下好像也不行
 
freddyzhu:<br>我没有试,书上介绍的方法是消息广播,因为感觉进行消息广播还是挺麻烦<br>的,没有必要为一个小功能耗大精力,所以我也就不做,只是检测有实例运<br>行就退出。
 
拜托请自己结束问题.<br>另外不要问一个问题a回答,b回答,c回答....最后自己来一个"这个问题我已经解决",<br>也不结束问题,也不告诉大家最后的解决办法.让大家都摸不到头脑.<br>来这里是讨论问题共同提高的,不是因为一点分数而当你的免费咨询
 
showwindow(最小化)
 
to freddyzhu:<br>&nbsp; &nbsp;我想知道你最后是如何解决的,谢谢!
 
我也一直没解决!
 
后退
顶部