首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

激活另一个过程的窗口

2012-12-30 
激活另一个进程的窗口[解决办法]Application.InitializeApplication.CreateForm(TForm1, Form1)Applicat

激活另一个进程的窗口


[解决办法]
     Application.Initialize;
     Application.CreateForm(TForm1, Form1);
     Application.Run;
我可没看到代码里有如果已经运行就自动关闭,只有释放mutex
想激活别的窗口用bringwindowtotop或者SetForegroundWindow都可以,不过要先知道窗口句柄,至于像调用其中的函数,需要dll注入了
[解决办法]
代码:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

const
  CM_RESTORE=WM_USER+$1000;{自定义的“恢复”消息}
  MYAPPNAME='MyDelphi';//重新定义窗体类名。


type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
   procedure   CreateParams(var   Params:   TCreateParams);   override;
   Procedure   RestoreRequest(var   message:   TMessage);   message   CM_RESTORE;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure   TForm1.CreateParams(var   Params:   TCreateParams);
begin
  inherited   CreateParams(Params);
  Params.WinClassName   :=   MYAPPNAME;
end;

procedure   TForm1.RestoreRequest(var   message:   TMessage);
begin
 if   IsIconic(Application.Handle) then
  Application.Restore
 else
  Application.BringToFront;
end;


end.



工程中:

program ChongKai;

uses
  Forms,
  windows,
  messages,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

const
  CM_RESTORE   =   WM_USER   +   $1000;   {自定义的“恢复”消息}   
  MYAPPNAME   = 'MyDelphi';   

var
  RvHandle   :   hWnd;


begin
  RvHandle   :=   FindWindow(MYAPPNAME,0);
  if   RvHandle   >   0   then
  begin
   PostMessage(RvHandle,   CM_RESTORE,   0,   0);
   Exit;
  end;

  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

------解决方案--------------------


procedure SwitchToThisWindow(h:Thandle;bo:boolean);stdcall;external 'User32.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
  SwitchToThisWindow(findwindow(nil,'程序标题'),true);
end;

如果是隐藏的窗体,可以先枚举找出它的handle,再调用此函数
[解决办法]
获取句柄,得到焦点
用勾子方法即可

热点排行