深圳全飞鸿

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 744|回复: 0
打印 上一主题 下一主题

delphi单开的实现标准pbjustone

[复制链接]

104

主题

171

帖子

1179

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1179
跳转到指定楼层
楼主
发表于 2019-6-1 16:38:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单开的实现标准pbjustone

该功能在terminal.exe pack_ctn.exe中实现 该部分在terminal.exe上有十多年的验证是可行的,无需再单独做功能测试!
以下内容放在dpr中! 可能需要头windows, SysUtils,

version 1: 收录于2019-03-20

  1. {$R *.res}

  2. var
  3.   MYHANDLE:Thandle;
  4.   MyAppName, MyClassName: array[0..255] of Char;
  5.   LastFound, MyPopup: HWND;

  6.   function LookAtAllWindows(Handle: HWND; Temp: LongInt): BOOL; stdcall;
  7.   var
  8.     WindowName, ClassName: Array[0..255] of Char;
  9.   begin
  10.     if GetClassName(Handle, ClassName, SizeOf(ClassName)) > 0 then
  11.       if StrComp(ClassName, MyClassName) = 0 then
  12.         if GetWindowText(Handle, WindowName, SizeOf(WindowName)) > 0 then
  13.           if StrComp(WindowName, MyAppName) = 0 then
  14.           begin
  15.               if Handle <> Application.Handle then
  16.                  LastFound := Handle;
  17.           end;
  18.     IF LASTFOUND=0 THEN
  19.         result := true
  20.     ELSE
  21.         RESULT :=FALSE;
  22.   end;

  23. begin
  24.   LastFound := 0;
  25.   GetWindowText(Application.Handle, MyAppName, SizeOf(MyAppName));
  26.   GetClassName(Application.Handle, MyClassName, SizeOf(MyClassName));
  27.   EnumWindows(@LookAtAllWindows, 0);
  28.   if LastFound <> 0 then
  29.   begin
  30.       MyPopup := GetLastActivePopup(LastFound);
  31.       BringWindowToTop(LastFound);
  32.       if IsIconic(MyPopup) then
  33.         ShowWindow(MyPopup, SW_RESTORE)
  34.       else
  35.         SetForegroundWindow(MyPopup);
  36.       Halt;
  37.   end ELSE
  38.   begin
  39.         //
  40.      Application.Initialize;
  41.          Application.CreateForm(TForm1, Form1);
  42.          Application.CreateForm(Txx, XX);
  43.      Application.Run;
  44.         //
  45.   end;
  46. end.
复制代码


注意:如是用户将程序改一个名字,这种方法就卡不住了。如果要卡得更严一点,则用mutex来:

  1. 加两个变量:
  2.   hmutex : HWND;
  3.   gt : Integer;

  4.   begin
  5.     hmutex:=CreateMutex(nil,True,'KB_TD@2008'); //注意改名
  6.     gt := GetLastError;
  7.     if gt = Error_ALREADY_EXISTS then {如果发现互斥体对象}
  8.     begin
  9.       Application.MessageBox('程序已经运行','提示',MB_OK);
  10.       Application.Terminate;
  11.       ReleaseMutex(hmutex);{释放互斥体}
  12.       Halt;
  13.     end;
  14.     //
  15.     Application.Initialize;
  16.     Application.CreateForm(TForm1, Form1);
  17.     Application.CreateForm(TDataModule2, DataModule2);
  18.     //Form1.ScaleBy(200,100);
  19.     Application.Run;
  20.     //
  21.     CloseHandle(hmutex);
  22.     //CloseHandle(OpenMutex(MUTEX_ALL_ACCESS,True,'KB_TD@2008'));
  23.   end;
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|nagomes  

GMT+8, 2025-5-5 06:30 , Processed in 0.022196 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表