首页 | 考研 | MBA | 专升本 | 成考 | 自考 | 高考 | 中考 | 出国 | 外语 | 电脑 | 公务员 | 司法 | 财考 | 资格考试 | 论文写作
 淘学考试计算机正文
 

delphi中,让程序只运行一次的方法(2)
 
 


编辑:xujie 时间:2007-11-27 来源:淘学考试网 推荐好友




program MyThreadTest;
   uses
   Windows,
  Forms,
  SysUtils,
  Messages,
   Dialogs,
   Unit1 in 'Unit1.pas' {Form1},
   {$R *.res}
   var
  myMutex,
  FindHid: HWND;
  MoudleName: string;
   function EnumWndProc(hwnd: Thandle; param: Cardinal): bool; stdcall;
   //由于用于api回调函数,请使用windows传统的参数传递方式stdcall
   var
   ClassName, WinMoudleName: string;
   WinInstance: THandle;
   begin
   result := true;
  SetLength(ClassName, 100);
   GetClassName(hwnd, pchar(ClassName), length(ClassName)); //获得当前遍历窗口的类名
   ClassName := pchar(ClassName); //在字符串后加结束符,确定字符串结束
   if UpperCase(ClassName) = UpperCase(TForm1.ClassName) then //比较类名
   begin
   WinInstance := GetWindowLong(hwnd, GWL_HINSTANCE); //获得当前遍历窗口的实例
  setlength(WinMoudleName, 100);
  //获得当前遍历窗口的程序文件名
  GetModuleFileName(WinInstance, pchar(WinMoudleName), length(WinMoudleName));
  WinMoudleName := pchar(WinMoudleName);
  WinMoudleName :=ExtractFileName(WinMoudleName);
  //MoudleName为工程全局变量,自身程序的文件名
  if UpperCase(WinMoudleName) = UpperCase(MoudleName) then
   begin
   FindHid := hwnd;//FindHid为工程全局变量保存找到的句炳
   result := false; //找到以后就结束遍历
   end;
  end;
   end;
   begin
  // CreateMutex建立互斥对象,并且给互斥对象起一个唯一的名字
   myMutex := CreateMutex(nil, false, 'hkOneCopy');
   if WaitForSingleObject(myMutex, 0) <> wait_TimeOut then
   //程序没有被运行过
   begin
   Application.Initialize;
   Application.CreateForm(TForm1, Form1);
   Application.Run;
  end else
   begin
   SetLength(MoudleName, 100);
  //获得自己程序文件名
   GetModuleFileName(HInstance, pchar(MoudleName), length(MoudleName));
   MoudleName := pchar(MoudleName);
  MoudleName := ExtractFileName(MoudleName);
   EnumWindows(@EnumWndProc, 0); //调用枚举函数
   if FindHid <> 0 then
   begin
   ShowWindow(FindHid,SW_RESTORE);
   SetForegroundWindow(FindHid);
   end;
  end;
   end.
   [EnumWindows函数使用]:
   EnumWindows 用来列举屏幕上所有顶层窗口。
   MSDN:
   The EnumWindows function enumerates all top-level windows on the screen by passing the handle to each window。

 

 

 相 关 内 容



.

  推荐课程
 
 
 
 
 
 
  资讯快报
  综合辅导
  技巧心得
版权信息 - 关于我们 - 联系方式 - 服务承诺 - 客户投诉 - 广告服务 - 网站合作 - 会员服务 - 友情链接 - 站长统计3
1 不良信息
举报中心
文明办网文明上网举报电话:15964542668
举报邮箱:topej@163.com
2 网络110
报警服务
服务热线:15964542668 电子邮件:guoyong@topej.com 服务 QQ:350125289
淘学之家(www.topej.com)旗下网站 ICP注册号:鲁ICP备07016860号