防止多次运行程序并激活已经运行程序的问题(100分)

  • 主题发起人 主题发起人 小羿
  • 开始时间 开始时间

小羿

Unregistered / Unconfirmed
GUEST, unregistred user!
刚学习Delphi不久,请大家指教,我用下面的代码
handle := findwindow('TApplication','xxx');
if handle <> 0 then
begin
ShowWindow(handle, SW_RESTORE);
halt;

可以实现这个功能,可是同时不想让程序在任务栏出现,我用下面的代码实现最小化
procedure TMForm.WMSysCommand(var msg: TWMSysCommand);
begin
if msg.CmdType and $FFF0 = SC_MINIMIZE then
visible := false
else
inherited;
end;

这样就出现了问题,没有办法激活已经运行的窗口了,有什么办法解决呢?
最好是使用更通用的隐藏任务栏程序的方法。
 
方法1.
还是用查找类名的方式
FindWindow,但参数就应该是
h:=FindWindow(nil, '标题栏文字');
sendmessage(h, wm_syscommand, sc_restore,0);
这样子试试
方法2.你可以自己定义一个消息来实现,将显示窗口的语句写到这个消息处理里面,然后通过sendmessage(h, 消息, 0,0);来实现
 
使用互斥量了来进行判断,如果存在的话就认为程序已经建立!
显示窗体,同上
________________________________
FMutHandle := OpenMutex(MUTEX_ALL_ACCESS, False, PChar(CUniqueAppStr));
if FMutHandle = 0 then // 互斥对象还没建立,说明还没有实例存在
begin
// 创建互斥对象
FMutHandle := CreateMutex(nil, False, PChar(CUniqueAppStr));
end;
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3603497
 
防止程序二次运行
procedure Tform1.formcreate(sender:tobject);
var
TAppname:array[0..127] of char;
hold:string;
Found:Hwnd;
begin
hold:=application.title;
found:=findwindow(nil,IAppname);//查找窗口
if found<>0 then
begin
showwindow(found,we_restore);
application.terminate;
end ;
end;
 
可能是我没有说清楚,防止多次运行已经实现了,关键是当主窗口的visible := false时
没有办法显示已经运行的程序
 
定义热键
 
转葵花宝。。。。
大家知道,在Win9x下实现很容易,但是在WinNT下就不那么……


program Project1;

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

{$R *.RES}

var
ExtendedStyle : Integer;

begin
Application.Initialize;

//==============================================================
ExtendedStyle := GetWindowLong (Application.Handle, GWL_EXSTYLE);

SetWindowLong(Application.Handle, GWL_EXSTYLE, ExtendedStyle OR WS_EX_TOOLWINDOW
AND NOT WS_EX_APPWINDOW);
//===============================================================

Application.CreateForm(TForm1, Form1);
Application.Run;
end.
///////////////////////////////////////////////////////////////
  一般Windows 95运行程序时都会在任务栏上出现按钮,如果你的程序是一个监视程序,那么出现按钮就不是明智之举了。要实现该功能就要在OnCreate事件里利用到API函数SetWindowLong
procedure TForm1.FormCreate(sender:TObject);
begin
SetWindowLong(Application,Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
end;
/////////////////////////////////////////////////////////
ShowWindow(Application.Handle, SW_HIDE);
SetWindowLong(Application.Handle, GWL_EXSTYLE,
GetWindowLong(Application.Handle, GWL_EXSTYLE)
or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);
 
如果程序有窗口标题。起动时按标题找。有就不启动。
否则给自己的程序建立个类。起动时按类找。有就不启动。
 
首先用类找:FindWindow('MyProgram', nil);
然后发送个自定义的消息给它;
“它”响应这个消息的时候调用 Application.Restore; !
如何?
 
还是靠自己解决,不使用visible := false
 
后退
顶部