请问怎样使程序只能运行一个,程序运行时让原来运行的那个处于最前端并获得焦点(50分)

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

devick

Unregistered / Unconfirmed
GUEST, unregistred user!
请问怎样使程序只能运行一个,程序运行时让原来运行的那个处于最前端并获得焦点,像千千静听那样,原来运行的程序的窗体即使隐藏了,下次运行时也能把它显示出来

请各位帮帮忙啊
 
THandle hand = findwindow("XXXX");
if hand<> null
PostMessage(hand,wm_ative,0,0);//可能不是这个消息插一下msdn,看一下具体的消息
 
program Project1;

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

{$R *.RES}

var Mutex: THandle;

procedure CheckPrevInst;
var
PrevWnd: HWnd;
begin
Mutex:=CreateMutex(NIL, False, 'SingleInstanceProgramMutex');
if WaitForSingleObject(Mutex, 10000)=WAIT_TIMEOUT then Halt;
PrevWnd:=FindWindow('TForm1', 'Form1');//主窗体的类名和标题
if PrevWnd<>0 then PrevWnd:=GetWindow(PrevWnd, GW_OWNER);
if PrevWnd<>0 then begin
if IsIconic(PrevWnd) then
ShowWindow(PrevWnd, SW_SHOWNORMAL)
else
SetForegroundWindow(PrevWnd);
Halt;
end;
end;


begin
Application.Initialize;
try
CheckPrevInst;
Application.CreateForm(TForm1, Form1);
finally
Form1.HandleNeeded;
ReleaseMutex(Mutex);
CloseHandle(Mutex);
end;
Application.Run;
end.
 
to kaida,
你的代码可以运行,不过要是Form1.hide了就显示不出来了,能不能改下,使窗体隐藏了也能显示出来啊
 
http://www.delphibbs.com/keylife/iblog_show.asp?xid=604
 
to 轻舞肥羊,
我看过你的笔记了,还是不能解决那个问题.我是这样做的,先创建一个新的工程,在工程文件里加入MultInst单元,然后在form1上放个按钮,按钮的OnClick事件里加入,form1.hide;
结果是:
  先运行程序,焦点转到别的程序的窗体或是最小化后再运行程序的话,会激活原来运行的程序.
  先运行程序,再点窗体上的按钮隐藏窗体后,再运行程序的话,窗体就是不会显示出来.
  不知道是怎么回事,你看看能不能解决这个问题.
  谢谢了~
 
if IsIconic(lParam) then
OpenIcon(lParam)
else
SetForegroundWindow(lParam);
改成
if IsIconic(lParam) then
OpenIcon(lParam)
else begin
ShowWindow(lParam, SW_SHOW);
SetForegroundWindow(lParam);
end;
或者你发消息让窗体响应,因为直接用ShowWindow好象有问题
 
在unit中的
uses后type前添加
const
CM_RESTORE = WM_USER + $1000; {自定义的“恢复”消息}
MYAPPNAME = 'My Delphi Program';

public 定义
{ Public declarations }
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) = TRUE then
Application.Restore
else
begin
Application.BringToFront;
ShowMessage('程序已经在运行了!');
end;
end;

在program中的
uses后添加
const
CM_RESTORE = WM_USER + $1000; {自定义的“恢复”消息}
MYAPPNAME = 'My Delphi Program';
var
RvHandle : hWnd;
{$R *.RES}

begin
RvHandle := FindWindow(MYAPPNAME, NIL);
if RvHandle > 0 then
begin
PostMessage(RvHandle, CM_RESTORE, 0, 0);
Exit;
end;
Application.Initialize;
......
就可以了.
 
轻舞肥羊,按照你的改了,还是有点问题,还是隐藏了窗体后出不来,想你说的直接发消息让窗体响应并显示出来应该行把,希望你有空的时候再改进下你的单元文件.谢谢你这么热情着帮助我.
我照着OldSnake的方法再改了下后可以可以实现我的要求了,OldSnake,也谢谢你哦

接受答案了
 
接受答案了
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部