熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

delphi中,讓程序只運行一次的方法[3]

2013-11-23 17:39:20  來源: Delphi編程 

  函數形式
  BOOL EnumWindows(WNDENUMPROC lpEnumFunc //callback function 
                 LPARAM lParam); //applicationdefined value
  其中 WNDENUMPROC 是回調函數回調函數中寫自己想做的操作當調用EnumWindows的時候每次遇到一個窗口系統就調用一次你的WNDENUMPROC 然後把窗口句柄傳給你
  EnumWindows
   函數成功則返回非
   函數失敗則返回
   EnumWindowsProc 返回同樣導致函數EnumWindows 返回

  另外該函數不列舉子窗口除了幾種擁有WS_CHILD 風格的系統所屬窗口
  MSDN
  The EnumWindows function does not enumerate child windowswith the exception of a few toplevel windows owned by the system that have the WS_CHILD style
使用舉例

  先聲明一個EnumWindowsProc 比如
  BOOL CALLBACK EnumWindowsProc_(HWND hwndLPARAM lparam) ;

  然後實現此函數寫入自己想做的事情比如
  BOOL CALLBACK EnumWindowsProc_(HWND hwndLPARAM lparam)
  { char lpWinTitle[]; 
    ::GetWindowText(hwndlpWinTitle); 
    CString m_strTitle;
    m_strTitleFormat(%slpWinTitle);
    if(m_strTitleFind(Internet Explorer)!=
    {  AfxMessageBox(這是一個IE窗口!) ; }  
    return TRUE ;
  }

  然後就可以在其他地方調用EnumWindows的時候使用回調函數比如
  ::EnumWindows(EnumWindowsProc_) ;
  這樣每當遇到IE窗口時就會進行 提示這是一個IE窗口! 的操作

  方法二

  不用互斥對象

  我們可以利用向系統添加全局原子的方法來防止多個程序實例的運行全局原子由Windows 系統負責維持它能保證其中的每個原子都是唯一的管理其引用計數並且當該全局原子的引用計數為從內存中清除我們用GlobalAddAtom 函數向全局原子添加一個個字節以內的字符串用GlobalFindAtom來檢查是否已經存在該全局原子最後在程序結束時用GlobalDeleteAtom函數刪除添加的全局原子示例如下
  Uses Windows
  const iAtom=SingleApp;
  begin
   if GlobalFindAtom(iAtom)= then
   begin
   GlobalAddAtom(iAtom);
   ApplicationInitialize;
   ApplicationCreateForm(TFormForm);
   ApplicationRun;
   GlobalDeleteAtom(GlobalFindAtom(iAtom));
   end
   else
   MessageBox(You can not run a second copy of this Appmb_OK);
  end
  利用全局原子的引用計數規則我們還可以判斷當前共運行了該程序的多少個實例
  var i:Integer;
  begin
   I:=;
  while GlobalFindAtom(iAtom)<> do
   begin
   GlobalDeleteAtom(GlobalFindAtom(iAtom));
   i:=i+;
   end;
   ShowMessage(IntToStr(I));
  end;

[]  []  []  


From:http://tw.wingwit.com/Article/program/Delphi/201311/24834.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.