来个简单的小问题

qyjiswgog 2005-06-02 11:31:56
要实现的功能如下:
在程序启动时检测一下看看当前的程序是否已经启动了,如果是的话,就提示用户"该程序已经启动",如果不是的话,就打开主程序
落 这段代码应该怎么写??
...全文
83 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
javafelia 2005-06-04
  • 打赏
  • 举报
回复
if ExeHandle<>0 then SendMessage(ExeHandle,WM_Close,0,0); //关闭程序
改为
if ExeHandle<>0 then Appliation.Terminate; //关闭程序

更为合理!
Larry1030 2005-06-03
  • 打赏
  • 举报
回复
wlbfeihu(下辈子还写程序)
方法简洁,可用。。。。
welltt 2005-06-03
  • 打赏
  • 举报
回复
不难啊,wlbfeihu(下辈子还写程序) ,andrew223(暴风雪) 两个的应该就可以了
g961681(VCL架构剖析ing......) ,哀,我菜鸟,看不懂·
学习
laZZe 2005-06-03
  • 打赏
  • 举报
回复
学习~~~
cjianwen 2005-06-03
  • 打赏
  • 举报
回复
学习~
duxin 2005-06-02
  • 打赏
  • 举报
回复

g961681(VCL架构剖析ing......) 方法可用



我来抢分

------------------------------------------------------------------------------
金盆洗澡 重出江湖 打劫.抢分 掀起一场腥风血雨 戒烟攒钱 只为换新车
Corn1 2005-06-02
  • 打赏
  • 举报
回复
启动时用FindWindow(nil, 主窗体名),如果返回<>0,表示该程序已启动。
andrew223 2005-06-02
  • 打赏
  • 举报
回复
修改dpr项目文件

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

{$R *.RES}
var Exehandle:Thandle;
begin
//获得句柄-->标题确定
ExeHandle:=findWindow(nil,'TEST');//返回句柄
if ExeHandle<>0 then SendMessage(ExeHandle,WM_Close,0,0); //关闭程序
Application.Initialize;
Application.Title := 'TEST';
Application.ShowMainForm:=False; //不显示主窗口
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

wlbfeihu 2005-06-02
  • 打赏
  • 举报
回复
var
hand:HWND;
Ret:Integer;
begin
Application.Initialize;
Application.Title:='aaaa;
hand:=CreateMutex(nil,false,'aaaa');
Ret:=GetLastError;
if Ret<>ERROR_ALREADY_EXISTS then
begin
Application.CreateForm(TDModule, DModule);
Application.CreateForm(TFrm_Main, Frm_Main);
Application.Run;
end
else
Application.MessageBox('程序已经运行!','警告',MB_OK);
ReleaseMutex(hand);

这样也是可以的
g961681 2005-06-02
  • 打赏
  • 举报
回复
//==============================================================================
// 工作流程
// 程序运行先取代原有向所有消息处理过程,然后广播一个消息.
// 如果有其它实例运行,收到广播消息会回发消息给发送程序,并传回它自己的句柄
// 发送程序接收到此消息,激活收到消息的程序,然后关闭自己
//==============================================================================
unit MultInst;

interface

uses
Windows ,Messages, SysUtils, Classes, Forms;

implementation

const
STR_UNIQUE = '{1E1084F3-A7FA-49B0-BEF4-CBF1F5451962}';
MI_ADDMESSAGE = 0; //新增一条消息
MI_ACTIVEAPP = 1; //激活应用程序
MI_GETHANDLE = 2; //取得句柄

var
iMessageID : Integer;
OldWProc : TFNWndProc;
MutHandle : THandle;
BSMRecipients : DWORD;

function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint):
Longint; stdcall;
begin
Result := 0;
if Msg = iMessageID then
begin
case wParam of
MI_ACTIVEAPP: //激活应用程序
if lParam<>0 then
begin
//收到消息的激活前一个实例
//为什么要在另一个程序中激活?
//因为在同一个进程中SetForegroundWindow并不能把窗体提到最前
if IsIconic(lParam) then
OpenIcon(lParam);
ShowWindow(lParam,SW_SHOW);
SetForegroundWindow(lParam);
//终止本实例
Application.Terminate;
end;
MI_GETHANDLE: //取得程序句柄
begin
PostMessage(HWND(lParam), iMessageID, MI_ACTIVEAPP,
Screen.ActiveForm.Handle);
end;
end;
end
else
Result := CallWindowProc(OldWProc, Handle, Msg, wParam, lParam);
end;

procedure InitInstance;
begin
//取代应用程序的消息处理
OldWProc := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC,
Longint(@NewWndProc)));

//打开互斥对象
MutHandle := OpenMutex(MUTEX_ALL_ACCESS, False, STR_UNIQUE);
if MutHandle = 0 then
begin
//建立互斥对象
MutHandle := CreateMutex(nil, False, STR_UNIQUE);
end
else begin
Application.ShowMainForm := False;
//已经有程序实例,广播消息取得实例句柄
BSMRecipients := BSM_APPLICATIONS;
BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,
@BSMRecipients, iMessageID, MI_GETHANDLE,Application.Handle);
end;
end;

initialization
//注册消息
iMessageID := RegisterWindowMessage(STR_UNIQUE);
InitInstance;

finalization
//还原消息处理过程
if OldWProc <> Nil then
SetWindowLong(Application.Handle, GWL_WNDPROC, LongInt(OldWProc));

//关闭互斥对象
if MutHandle <> 0 then CloseHandle(MutHandle);

end.
把这个文件包含到你当前工程中,应该就可以了!
也是抄来用的!

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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