重复运行程序会造成系统资源的浪费(这句话真别扭),很多情况 下我们把程序最小化或者隐藏起来,想用这个程序的时候会习惯的doulbeclick程序的图标,wo~又一个程序运行了,我们本意是既然已经是打开的程序,你把程序再给我显现出来不就可以了?弱智的程序员阿(不是说你,也不是说我,假想。。)
常见的方法有三种,一、原子方法;二、互斥量、三、查找窗口(Findwindow or EnumWindow)
这是其中一种,晚上把这几种方法都尝试一边,其实很简单
(最近在学习asm,使用的masm32和radasm写win32程序也很方便,和win32 sdk差不多)
szClassName db'网关切换器[iHqq]',0
;only single instance is running
;szClassName is dialog name of instance
invoke FindWindow,NULL,addr szClassName;查找符合条件的窗口
.if eax != NULL ;如果找到窗口
invoke ShowWindow,eax,SW_SHOW ;显示出来
invoke SetForegroundWindow,eax ;放到最前面来;
invoke ExitProcess,0 ;结束本实例
.endif
;如果运行到这,说明没有找到符合条件的窗口,也就是程序是第一次运行
事实上这样并不能将窗口出现在最前面,以下抄袭别人
[SetForegroundWindow会调用FlashWindowEx来闪烁目标窗口,代表已经切换了
窗口,但事实上往往我们需要在某个时候将我们的窗口弹出到最前台来!曾听说过有高
手使用修改窗口切换的糸统规则来达到此目的,这样做未必太麻烦了,必定不是每个人
都是高手呢!下面给大家介绍一个"偏方",非常简单,只是利用了一个MSDN未公开的函数罢了.
这个未公开的函数是:SwitchToThisWindow
它的c格式的原形是:
void WINAPI SwitchToThisWindow (
HWND hWnd, // Handle to the window that should be activated
BOOL bRestore // FAULS表示最小化显示;
);
由于没有原型和库,我们在使用时通常用动态联接法]
szClassName db'网关切换器[iHqq]',0
szFuName db'SwitchToThisWindow',0
szUser32 db'user32.dll',0
;only single instance is running
;szClassName is dialog name of instance
invoke FindWindow,NULL,addr szClassName
.if eax != NULL
mov oldhWnd,eax
invoke ShowWindow,eax,SW_SHOW
invoke GetModuleHandle,addr szUser32 ;得到地址空间内user32.dll的模块句柄,因为user32已经载入,所以使用GetModuleHandle,而不是loadlibrary,我们可以不考虑释放问题;
invoke GetProcAddress,eax,addr szFuName ;得到SwitchToThisWindow的地址;
push TRUE
push oldhWnd
call eax
invoke ExitProcess,0
.endif
转载于:https://www.cnblogs.com/iHqq/archive/2007/02/27/658305.html