如何通过句柄控制其他程序主窗口的Visible属性

时间:2022-03-24 14:37:36
防止重复打开,希望在第二次开启程序时激活已打开程序,遇到点问题

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属性应该能解决我的问题
当然如果有其他不这么复杂的方法更好,多谢了!

8 个解决方案

#1


已知句柄窗口 也是 delphi的vcl吗?
强制类型转换 有没有效果?

#2


【防止重复打开,希望在第二次开启程序时激活已打开程序】
一般是程序自己利用信号量、互斥实现的

#3


是的,请问怎么强制转换?
引用 1 楼 sz_haitao 的回复:
已知句柄窗口 也是 delphi的vcl吗?
强制类型转换 有没有效果?

#4


开始想用互斥的,可是看了半天没看懂,后来发现这个容易点,就用这个了


引用 2 楼 sz_haitao 的回复:
【防止重复打开,希望在第二次开启程序时激活已打开程序】
一般是程序自己利用信号量、互斥实现的

#5


http://topic.csdn.net/u/20110707/16/6ce84817-012f-486a-a8b4-b74ff3ea6107.html

#6


那个帖子里面别人写的代码对我没有用,你写的没注释,对我这个新手来说就是天书。

既然不会改Visible属性,我就想了一个曲线救国的办法,干脆不改它的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,不太好看。

应该还有更好的办法,可惜高手都不屑看


引用 5 楼 m617105 的回复:
http://topic.csdn.net/u/20110707/16/6ce84817-012f-486a-a8b4-b74ff3ea6107.html

#7


那个是伴水大侠,开源的屏幕画刷中的一部分,功能就是唯一运行。有兴趣的话,可以用svn下载看看,有助于提高。
http://topic.csdn.net/u/20110331/02/D6330B1C-B4B3-4DF1-836F-CB08B48EDFE9.html#r_73340803

#8


多谢楼上!的确很强大!

#1


已知句柄窗口 也是 delphi的vcl吗?
强制类型转换 有没有效果?

#2


【防止重复打开,希望在第二次开启程序时激活已打开程序】
一般是程序自己利用信号量、互斥实现的

#3


是的,请问怎么强制转换?
引用 1 楼 sz_haitao 的回复:
已知句柄窗口 也是 delphi的vcl吗?
强制类型转换 有没有效果?

#4


开始想用互斥的,可是看了半天没看懂,后来发现这个容易点,就用这个了


引用 2 楼 sz_haitao 的回复:
【防止重复打开,希望在第二次开启程序时激活已打开程序】
一般是程序自己利用信号量、互斥实现的

#5


http://topic.csdn.net/u/20110707/16/6ce84817-012f-486a-a8b4-b74ff3ea6107.html

#6


那个帖子里面别人写的代码对我没有用,你写的没注释,对我这个新手来说就是天书。

既然不会改Visible属性,我就想了一个曲线救国的办法,干脆不改它的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,不太好看。

应该还有更好的办法,可惜高手都不屑看


引用 5 楼 m617105 的回复:
http://topic.csdn.net/u/20110707/16/6ce84817-012f-486a-a8b4-b74ff3ea6107.html

#7


那个是伴水大侠,开源的屏幕画刷中的一部分,功能就是唯一运行。有兴趣的话,可以用svn下载看看,有助于提高。
http://topic.csdn.net/u/20110331/02/D6330B1C-B4B3-4DF1-836F-CB08B48EDFE9.html#r_73340803

#8


多谢楼上!的确很强大!