知识大全 delphi中,让程序只运行一次的方法[3]
Posted 函数
篇首语:一个不想蹚过小河的人,自然不想远涉重洋。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 delphi中,让程序只运行一次的方法[3]相关的知识,希望对你有一定的参考价值。
函数形式 BOOL EnumWindows(WNDENUMPROC lpEnumFunc //callback function LPARAM lParam); //application defined value 其中 WNDENUMPROC 是回调函数 回调函数中写自己想做的操作 当调用EnumWindows的时候 每次遇到一个窗口 系统就调用一次你的WNDENUMPROC 然后把窗口句柄传给你 EnumWindows 函数成功则返回非 值 函数失败则返回 值 EnumWindowsProc 返回 值 同样导致函数EnumWindows 返回 值
另外 该函数不列举子窗口 除了几种拥有WS_CHILD 风格的系统所属窗口 MSDN The EnumWindows function does not enumerate child windows with the exception of a few top level windows owned by the system that have the WS_CHILD style 使用举例
先声明一个EnumWindowsProc 比如 BOOL CALLBACK EnumWindowsProc_ (HWND hwnd LPARAM lparam) ;
然后实现此函数 写入自己想做的事情 比如 BOOL CALLBACK EnumWindowsProc_ (HWND hwnd LPARAM lparam) char lpWinTitle[ ]; ::GetWindowText(hwnd lpWinTitle ); CString m_strTitle; m_strTitle Format( %s lpWinTitle); if(m_strTitle Find( 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); Application Initialize; Application CreateForm(TForm Form ); Application Run; GlobalDeleteAtom(GlobalFindAtom(iAtom)); end else MessageBox( You can not run a second copy of this App mb_OK); end 利用全局原子的引用计数规则 我们还可以判断当前共运行了该程序的多少个实例 var i:Integer; begin I:= ; while GlobalFindAtom(iAtom)<> do begin GlobalDeleteAtom(GlobalFindAtom(iAtom)); i:=i+ ; end; ShowMessage(IntToStr(I)); end;
cha138/Article/program/Delphi/201311/24834相关参考