[摘要]MB_ICONINFORMATION); 需要注意的是,很可能程序的各个实例有不同的窗口名,如果象下面这样调用FindWindow HWND hWnd = FindWindow(szC...
MB_ICONINFORMATION);
}
需要注意的是,很可能程序的各个实例有不同的窗口名,如果象下面这样调用FindWindow
HWND hWnd = FindWindow(szClassName,NULL);
则查找所有的窗口并匹配窗口类名,如果你能保证你的窗口类名是唯一的,那么你可以信赖FindWindow,否则,你需要用更好的方法。
方法二
通过在EXE之间共享数据段从而共享数据来判断是否有程序的另一个实例存在。
每个EXE或DLL都是由段的集合组成,在Win32程序中,每个段以点(.)开头。例如,当编译程序是编译器时,则将所有代码放入一个叫.text的段、将所有未初始化的数据放入.bss段、将所有初始化的数据放入.data段。
可以给每个段赋予一个或多个属性(以下为常用的一些段属性):
READ 段中的数据可读
WRITE 段中的数据可写
SHARED 段中的数据可被多个实例共享
EXECUTE 段中的数据可被执行
可以用以下指令生成段:
#pragma data_seg("Shared")
static LONG g_lInstanceCount = -1;
#pragma data_seg()
编译器生成这段代码时,产生一个新段,并把它所在#pragma data_seg("Shared")指令后的初始化数据放入新段Shared,未初始化的数据放入.bss段。#pragma data_seg()以后的数据放回缺省数据段。
仅告诉编译器把特定数据放入自己的段内还不足以共享它们,还要告诉链接器在某一特定段内变量要共享。可以在链接时指定这个段的属性。
/section:Shared,rws
段名 属性
程序初始化时,例如调用WinMain函数时,调用InterlockedIncrement函数使共享段内变量加1,就可以通过判断共享段内变量的值来判断一个程序有几个实例在运行。以下代码演示了如何判断一个正在运行的程序实例是这个程序的第一个实例。
BOOL bIsFirstInstance = (InterlockedIncrement(&g_lInstanceCount) == 0);
if(!bIsFirstInstance){
MessageBox(NULL, _TEXT("Screen Saver Launcher is already running."), g_szAppName,
MB_OK
关键词:从任务通知区打开屏幕保护程序