防止重复打开,希望在第二次开启程序时激活已打开程序,遇到点问题var
Handle : THandle; //程序句柄
MHandle : THandle; //主窗口句柄
begin
Application.Initialize;
Handle:= FindWindow(nil,'A');
MHandle:= FindWindow(nil,'B');
Application.Title := 'A';
if Handle <> 0 then
begin
if IsIconic(Handle) then //判断程序是否最小化
ShowWindow(Handle, SW_RESTORE);
if MHandle<>0 then
begin
ShowWindow(Handle, SW_RESTORE);
..... //实现将主窗口Visible属性设为True
end;
SetForegroundWindow(Handle);
SetActiveWindow(Handle);
end主要我使用CoolTrayIcon将程序最小化到托盘了,CoolTrayIcon源码中实现最小化到托盘用了两句代码:
Application.MainForm.Visible := False;
ShowWindow(Application.Handle, SW_HIDE);
恢复用了下面两句:
ShowWindow(Application.Handle, SW_RESTORE);
Application.MainForm.Visible := True;所以如果只执行ShowWindow(Handle, SW_RESTORE);
并不能恢复程序,只能在任务栏中出现,但是看不到窗口,所以请教怎么控制已知句柄窗口的Visible属性ShowWindow(MHandle, SW_RESTORE);能够是窗口显示,但是下一次调用CoolTrayIcon源码中实现最小化到托盘的命令就无效了,我跟踪一下发现Application.MainForm.Visible := False;不起作用了,除非再执行一下Application.MainForm.Visible := True;才能恢复所以如果能够直接控制已知句柄窗口的Visible属性应该能解决我的问题
当然如果有其他不这么复杂的方法更好,多谢了!
Handle : THandle; //程序句柄
MHandle : THandle; //主窗口句柄
begin
Application.Initialize;
Handle:= FindWindow(nil,'A');
MHandle:= FindWindow(nil,'B');
Application.Title := 'A';
if Handle <> 0 then
begin
if IsIconic(Handle) then //判断程序是否最小化
ShowWindow(Handle, SW_RESTORE);
if MHandle<>0 then
begin
ShowWindow(Handle, SW_RESTORE);
..... //实现将主窗口Visible属性设为True
end;
SetForegroundWindow(Handle);
SetActiveWindow(Handle);
end主要我使用CoolTrayIcon将程序最小化到托盘了,CoolTrayIcon源码中实现最小化到托盘用了两句代码:
Application.MainForm.Visible := False;
ShowWindow(Application.Handle, SW_HIDE);
恢复用了下面两句:
ShowWindow(Application.Handle, SW_RESTORE);
Application.MainForm.Visible := True;所以如果只执行ShowWindow(Handle, SW_RESTORE);
并不能恢复程序,只能在任务栏中出现,但是看不到窗口,所以请教怎么控制已知句柄窗口的Visible属性ShowWindow(MHandle, SW_RESTORE);能够是窗口显示,但是下一次调用CoolTrayIcon源码中实现最小化到托盘的命令就无效了,我跟踪一下发现Application.MainForm.Visible := False;不起作用了,除非再执行一下Application.MainForm.Visible := True;才能恢复所以如果能够直接控制已知句柄窗口的Visible属性应该能解决我的问题
当然如果有其他不这么复杂的方法更好,多谢了!
强制类型转换 有没有效果?
改CoolTrayIcon的最小化托盘和恢复的代码如下:
最小化:
ShowWindow(Application.MainForm.Handle, SW_HIDE);
ShowWindow(Application.Handle, SW_HIDE);
恢复代码:
ShowWindow(Application.Handle, SW_RESTORE);
ShowWindow(Application.MainForm.Handle, SW_RESTORE);
ShowWindow(Application.MainForm.Handle, SW_MAXIMIZE);然后工程文件中改为:
var
Handle : THandle; //程序句柄
MHandle : THandle; //程序句柄
begin
Application.Initialize;
Handle:= FindWindow(nil,'工装查询系统');
MHandle:= FindWindow(nil,'工装查询系统 ');
Application.Title := '工装查询系统';
if Handle <> 0 then
begin
if IsIconic(Handle) then
ShowWindow(Handle, SW_RESTORE);
SetForegroundWindow(Handle);
SetActiveWindow(Handle);
if MHandle<>0 then
begin
ShowWindow(MHandle, SW_RESTORE);
ShowWindow(MHandle, SW_MAXIMIZE);
end;
end
。。这样能够实现我的要求,就是恢复程序时会先Normal再Max,不太好看。应该还有更好的办法,可惜高手都不屑看
http://topic.csdn.net/u/20110331/02/D6330B1C-B4B3-4DF1-836F-CB08B48EDFE9.html#r_73340803