如何让应用程序知道自己已经执行了!

Zboy 1999-12-29 06:06:00
请教各位高人,如何让Delphi编写的应用程序知道它已经执行了,从而避免重复执行。
(我写的某个应用程序被人在其快捷方式上多次点击导致死机)。
请赐教,万分感谢。
...全文
2142 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
riceball 1999-12-31
  • 打赏
  • 举报
回复
u can use Windows Message func.
like this:

program xxxx;

uses
Forms,
Windows,
SysUtils,
MainForm in 'MainForm.pas' {frmMain: TfrmMain};

{$R *.RES}

var
Previous: HWND;
{This code, to allow file association and open doubleclicked file in the running instance of app
was written by Andrius Adamonis}
function EnumWindowsCallback(Handle: HWND; Param: LPARAM): Boolean; stdcall;
function IsMyClass: Boolean;
var
ClassName : array[0..30] of Char;
FormClassName: string;
begin
GetClassName(Handle, ClassName, 30);
Result := (StrIComp(ClassName, 'TfrmMain') = 0) and { this finds my window, TfrmMain }
(SendMessage(Handle, WM_FINDINSTANCE, 0, 0) = MyUniqueConst); { this checks if this is really my application }
end;
begin
Result := not IsMyClass; { needs True to continue }
if not Result { = MyClass } then Previous := Handle;
end;

var
ATOM: TAtom;
begin
Previous := 0;
ATOM := 0;
EnumWindows(@EnumWindowsCallback, 0);
if Previous <> 0 then
begin
PostMessage(Previous, WM_RESTOREAPP, 0, 0);
Exit;
end;
Application.Initialize;
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end.

unit MainForm;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ShellApi, StdActns, ActnList, ImgList, Menus, ToolWin, ComCtrls;

const
WM_RESTOREAPP = WM_USER + 3;
MyUniqueConst = $118388;

var
WM_FINDINSTANCE: Integer;

type

TfrmMain = class(TForm)
......
protected
procedure WMRestoreApp(var Msg: TMessage); message WM_RESTOREAPP;
public
procedure DefaultHandler(var message); override;
end;

....

procedure TfrmMain.DefaultHandler(var message);
var
S: string;
begin
with TMessage(message) do
if Msg = WM_FINDINSTANCE then
begin
Result := MyUniqueConst;
end
else inherited DefaultHandler(message);
end;

procedure TfrmMain.WMRestoreApp(var Msg: TMessage);
begin
ShowApplication;
end;

initialization
WM_FINDINSTANCE := RegisterWindowMessage('MyForm: find previous instance');
if WM_FINDINSTANCE = 0 then raise Exception.Create('Initialization failed');

end.
BlackSword 1999-12-30
  • 打赏
  • 举报
回复
如果程序是VC做的话,CMutex我决得是最好的选择!
barton 1999-12-30
  • 打赏
  • 举报
回复
//项目文件
...

begin
Application.initialation;
if CreateMutex then begin
Application.CreateForm(Form1, TForm1);
Application.Run;
end else
DestroyMutex;
end;

//主窗体文件

...

implementation

var
Mutex: hWnd;

function CreateMutex: Boolean;
var
PrevInstHandle: THandle;
AppTitle: PChar;
begin
AppTitle := StrAlloc(100);
StrPCopy(AppTitle, Application.Title);
Result := True;
Mutex := Windows.CreateMutex(nil, False, AppTitle);
if (GetLastError = ERROR_ALREADY_EXISTS) or (Mutex = 0) then begin
Result := False;
SetWindowText(Application.Handle, '');
PrevInstHandle := FindWindow(nil, AppTitle);
if PrevInstHandle <> 0 then begin
if IsIconic(PrevInstHandle) then
ShowWindow(PrevInstHandle, SW_RESTORE)
else
BringWindowToTop(PrevInstHandle);
SetForegroundWindow(PrevInstHandle);
end;
if Mutex <> 0 then
Mutex := 0;
end;
StrDispose(AppTitle);
end;

procedure DestroyMutex;
begin
if Mutex <> 0 then
CloseHandle(Mutex);
end;

menxin 1999-12-29
  • 打赏
  • 举报
回复
互斥对象(CreateMutex)应该是最好的方法,但还有很多方法,例如运用注册表等等。
hephaestus 1999-12-29
  • 打赏
  • 举报
回复

微软说:创建Mutex!还给Mutex起个一个怪名字.也才几个API调用而已

有时窗口的Text是变化的,用FindWindow写不出来,而且这样也不专业!
tide 1999-12-29
  • 打赏
  • 举报
回复
有两种方法:
1,用 api 函数 FindWindow .如果你窗口的title 为“test"

HWND FirsthWnd,FirstChildhWnd;
if(FindWindow(NULL,"test"))
{

FirstChildWnd=GetLastActivePopup(FirsthWnd);
BringWindowToTop(FirsthWnd);
if(FirsthWnd!=FirstChildWnd)
BringWindowToTop(FirstChildWnd);

ShowWindow(FirsthWnd,SW_SHOWNORMAL);
return false;
}

2. 创建一个mutex. 用 CreateMutex; 比较复杂一点儿。如果第一种方法不能满足要求再联系。

【为什么要学习这门课程?】 本课程的主要目标不是执行恶意危害,而是为您提供逐步的指导,以便您可以学习道德白帽、渗透测试和安全态势评估,因为它与web应用程序有关。通过本课程教授的技能,您将了解到许多前沿危害安全技术相关的各种概念。课程包含多媒体教程和动手演示,用户可以适用于真实场景,并且网络安全资深专家奥马尔·桑托斯为感兴趣的人提供了一些关键建议,包括如何成为一个职业道德白帽,或仅仅是跟上不断变化的漏洞威胁,让你或你的客户网络的web应用程序更加安全。【课程亮点】 1、通过课程学习帮助您学习道德白帽、渗透测试和安全态势评估,包括危害、分析和减轻web应用程序漏洞的方法,2、将展示如何为网络应用测试建立一个渗透测试实验室,你将学习如何执行侦察和分析。 3、您将了解如何利用多种漏洞,包括身份验证、会话管理、基于注入的方法、跨站点脚本编写、跨站点请求伪造和它们的加密实现。 【讲师介绍】  Omar Santos(奥马尔·桑托斯)—— 思科PSIRT首席工程师、作家Omar Santos(奥马尔·桑托斯)是思科产品安全事件响应团队(PSIRT)的首席工程师,指导和领导团队工程师和事件经理对安全漏洞进行调查和解决。桑托斯著有20多本网络安全方面的专著,在全球拥有大量读者,他制作的大量白皮书、文章、安全配置指南等相关内容被大量媒体引用,如《共和报》、《连线》、《ZDNet》、《网络独家新闻》、《TechCrunch》、《财富》、《Ars Technica》等等。同时,他还是网络安全社区的一名活跃成员,他参与很多重要行业的网络安全倡议和标准制定。他还会积极帮助企业、学术机构、州和地方执法机构,提高关键基础设施的安全性。【课程收获】 1、评估你需要知道的一切,以执行道德白帽和渗透测试的web应用程序2、了解web应用程序协议、HTTP请求/响应、会话管理和cookie、DevOps、云服务、web应用程序框架和Docker容器,以便更好地评估web应用程序的漏洞3、构建自己的web应用程序实验室进行渗透测试4、通过几种技术和应用程序对web应用程序进行配置和执行被动和主动侦察5、利用身份验证和会话管理职责 6、利用并减轻基于注入的命令、SQL和XML漏洞7、利用和减轻跨站脚本危害(XSS)和跨站请求伪造(CSRF)漏洞8、利用和减轻密码漏洞 9、理解和测试api以减轻web应用程序危害10、理解并减轻客户端、HTML5和AJAX的漏洞11、检查可以利用(并保护)web应用程序漏洞的其他途径【面向人群】1、所有开始从事职业白帽和渗透测试工作的网络安全专业人员 2、准备考取CompTIA PenTest+,道德白帽认证(CEH),危害安全专家认证(OSCP),以及其他道德白帽认证的人3、任何想要学习成为道德白帽所需技能的网络安全专业人员,或者想要学习更多关于一般安全渗透测试方法和概念的网络安全专业人员

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧