其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

delphi中,让程序只运行一次的方法[3]


发布日期:2023年09月14日
 
delphi中,让程序只运行一次的方法[3]

函数形式

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;

[] [] []

               

上一篇:Delphi 数据库开发:职员奖惩管理功能

下一篇:delphi中,让程序只运行一次的方法[2]