快速业务通道

只运行一个实例且试图运行第二个实例时自动激活第一个实例

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22

本文配套源码

很多程序象winamp,TTplayer,RealPlayer等都有自动激活前一个实例的功能,其实这玩意也很简单的 ,在VB中可以用App.hInstance 来判断是否运行了程序的一个实例,用API函数FindWindow来找到前一个 实例的句柄,从而为激活她做好了准备。但是App.hInstance 有很大的局限性,一个不需要其他资源支 持的EXE文件,如果你复制到其他目录,这个复制品就可以畅通无阻的运行而不管他的前辈是否已运行, 如果这个程序需要独占某个硬件或其他资源,这样就会存在潜在的冲突,因此我们必须寻找其他可靠的 途径来保证我们作品的排一无二性。

Windows中互斥体的概念使得上面的问题得以轻松解决。我 们在程序第一次运行得时候创建一个特定的互斥体,在第二次或者更多次运运行时程序在创建互斥体时 就会发生错误,我们捕捉到这个错误并加以适当得处理就得以保证程序运行得唯一性。

那如何激 活前一个实例呢,别着急,Windows的API函数就是丰富,我们只要有了程序的句柄(就相当于人们的身 份证一样,系统会保证他的唯一性),就可以对他进行随意的操作, ShowWindow,SetForeGround,SetActiveWindow等等。如何得到这个ID呢,FindWindow,不错,很多人会 这么说。的确,这是个方法,并且是个不错的函数,但是她的程序标题的敏感性使得很多情况下我们必 须抛弃她。比如winmap她的标题会随着播放歌曲的改变而变化。怎么办,不急,既然句柄是唯一的,我 们为何不在程序启动后把她记录在我们的硬盘上呢。

好了,前面的分析使得我们在理论上能够实 现类似于winamp的效果了,那为何不添加点新东西:在我们激活第一个窗体时,我们让她来回闪烁几下 不是更能够得到用户的注意吗?FlashWindow的效果,对,就是FlashWindow,仔细看看她的使用方法, 要配合一个定时器来使用,哎,实现这个小功能,还要用定时器,真是有点不划算啊,并且在sub main 中如何使用定时器也值得一番研究。那有没有简单得方法,of course, 看看FlashWindowEx把,Ex扩展 的函数就是不一样,她有一个结构参数可以指定闪烁的次数和每次闪烁的时间。COOL!

说了一堆 ,还的付诸于实践,代码,我要的是代码,别急,就来了。

模块 中:

''程序实现功能:自动激活前一个实例

''作者:laviewpbt

''联系方式: laviewpbt@sina.com

''QQ:33184777

''版本:Version 1.3.0

''说明:复制请保留源作者信息,转载请说明,欢迎大家提出 意见和建议

Public Declare Function ReleaseMutex Lib "kernel32" (ByVal hMutex As Long) As Long

Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As SECURITY_ATTRIBUTES, ByVal bInitialOwner As Long, ByVal lpName As String) As Long

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long

Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Private Declare Function FlashWindowEx Lib "user32.dll" (ByRef pfwi As FLASHWINFO) As Long

Private Const FLASHW_STOP = 0 ''停止闪烁,系统恢复窗体到她原始的状态.

Private Const FLASHW_CAPTION = &H1 ''闪烁窗体的标题

Private Const FLASHW_TRAY = &H2 ''闪烁任务栏

Private Const FLASHW_AL

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号