只运行一个程序

重复运行程序会造成系统资源的浪费(这句话真别扭),很多情况 下我们把程序最小化或者隐藏起来,想用这个程序的时候会习惯的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/p/658305.html