只运行一个实例且试图运行第二个实例时自动激活第一个实例2009-12-31 博客园 彭佳乐很多程序象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!说了一堆 ,还的付诸于实践,代码,我要的是代码,别急,就来了。