为什么IsIconic永远返回False?(200)

  • 主题发起人 主题发起人 DF7C3
  • 开始时间 开始时间
D

DF7C3

Unregistered / Unconfirmed
GUEST, unregistred user!
我想让程序只运行一份,于是写了如下代码。问题是当主窗体最小化以后,如果再次运行程序,主窗体并不能显示到前面来,因为IsIconic(HWindow)永远返回False,后面那一句SendMessage无法执行!请问这是怎么回事,如何解决?program Project1;uses Forms, Windows, Messages, MyUnit_MDIParent in 'MyUnit_MDIParent.pas' {My_MDIParent};{$R *.res}var HWindow: THandle;begin Application.Initialize; HWindow := FindWindow('TMy_MDIParent', 'My_MDIParent'); if HWindow <> 0 then begin if IsIconic(HWindow) then begin SendMessage(HWindow, WM_SYSCOMMAND, SC_RESTORE, 0); end; SetForeGroundWindow(HWindow); Application.Terminate; Exit; end; Application.Title := 'My_MDIParent'; Application.CreateForm(TMy_MDIParent, My_MDIParent); Application.Run;end.
 
因为delphi显示在任务栏上的窗口并不是主窗口,而是tapplication的一个窗口主窗口最小化的时候,tapplication接管了这个操作,只是将主窗口隐藏,而用API画了个最小化的动画,所以你只判断主窗口是否最小化没用,要对application的窗口操作才有效.或者,你隐藏tapplication的窗口,把主窗口放在任务栏上,也可以
 
以下摘自网上:『Win32 API』IsIconic2008-01-31 03:44 P.M.函数原型: BOOL IsIconic(HWND hWnd);函数说明: The IsIconic function determines whether the specified window is minimized (iconic).谁说俺们没效? 俺们跟谁急! 在MFC自动生成的代码里经常可以看到OnPaint函数里有个IsIconic的函数调用, 来判断窗口是否最小化. 但是最小化后, 这段代码是跑不进来的. WHy? 我们来看WIn32 SDK代码: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }上面代码是用来分发消息的, GetMessage用来获取当前窗口的动作, 当我们最小化或者失去窗口焦点不做任何操作时, 我们还在GetMessage里等待Windows消息呢, 怎么能跑到窗口过程函数里做我们的事情呢?
 
参考http://www.why100000.com/Htmls/tabDelphi36.htmunit Unit2;interfaceimplementationinitialization IsLibrary := true;end.program Project1;//注意单元排列顺序uses Windows, Messages, Unit2 in 'Unit2.pas',//必须放在Forms单元的前面 Forms, Unit1 in 'Unit1.pas' {Form1};{$R *.res}var HWindow: THandle;begin Application.Initialize; HWindow := FindWindow('TForm1', 'Form1'); if HWindow <> 0 then begin if IsIconic(HWindow) then begin SendMessage(HWindow, WM_SYSCOMMAND, SC_RESTORE, 0); end; SetForeGroundWindow(HWindow); Application.Terminate; Exit; end; Application.CreateForm(TForm1, Form1); Application.Handle:=Form1.Handle;//必须 Application.Run;end.
 
为何不试试那个 防止多实例的单元呢?MultInst.pas
 

Similar threads

S
回复
0
查看
906
SUNSTONE的Delphi笔记
S
S
回复
0
查看
884
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
397
import
I
后退
顶部