+ -
当前位置:首页 → 问答吧 → 激活另一个进程的窗口

激活另一个进程的窗口

时间:2011-12-28

来源:互联网

Delphi(Pascal) code
 Mutex:=CreateMutex(NIL,True,'SingleApp');
     IF GetLastError<>ERROR_ALREADY_EXISTS THEN//如果不存在另一实例
     BEGIN
     Application.Initialize;
     Application.CreateForm(TForm1, Form1);
     Application.Run;
     END;
     ReleaseMutex(Mutex);


上面这段代码会在程序执行时 如果已经运行就自动关闭

我想在关闭之前激活已经打开的进程的窗口 请问如何实现

作者: ndscndscnd   发布时间: 2011-12-28

还有就是如果能调用其中的函数就更好了

作者: ndscndscnd   发布时间: 2011-12-28

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

作者: funxu   发布时间: 2011-12-28

代码:


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.

作者: mwy654321   发布时间: 2011-12-28

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

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

如果是隐藏的窗体,可以先枚举找出它的handle,再调用此函数

作者: kaikai_kk   发布时间: 2011-12-28

窗口显示出来了,其他都可以用, 但是上面的最小化 和关闭按钮 没有作用

是不是还要激活进程啊

作者: ndscndscnd   发布时间: 2011-12-28

获取句柄,得到焦点
用勾子方法即可

作者: sgzhou12345   发布时间: 2011-12-28

引用 7 楼 sgzhou12345 的回复:

获取句柄,得到焦点
用勾子方法即可

你指的是进程吗?

作者: ndscndscnd   发布时间: 2011-12-28

热门下载

更多