程序只运行一次并激活原来的程序

程序只运行一次并激活原来的程序

ID:35479167

大小:69.16 KB

页数:16页

时间:2019-03-25

程序只运行一次并激活原来的程序_第1页
程序只运行一次并激活原来的程序_第2页
程序只运行一次并激活原来的程序_第3页
程序只运行一次并激活原来的程序_第4页
程序只运行一次并激活原来的程序_第5页
资源描述:

《程序只运行一次并激活原来的程序》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、程序只运行一次并激活原来的程序我们的程序有时候只允许运行一次,并且最好的情况是,如果程序笫—•次运行,就激活原來的程序。网上有很多的方法实现程序只运行一次,但对于激活原來的窗口却都不怎么好。关键就在于激活原来的程序,一般的做法是在工程开始时,打开互斥量对象,如果打不开表示程序还没有运行,创建一个斤斥量对象;如果打得开表示程序C经运行了,查找程序中一个特定的窗口,一般是主窗口,然后发送一个口定义消息,主窗口在这个消息处理中激活自己。我原来就是这么做的,却发现有很多问题。主窗口在消息处理函数中激活不了口已众所周知激活•个窗口最有效的方法半然就是SetForegroundwindow,但在主窗F

2、l中调用这个函数激活门己的效果却是只在标题栏闪了一闪,如果在其他进程调用该函数则不会右问题;另外,如果程序是最小化的,它连闪都不闪了。对于这些问题,我想了下面的办法,在知道原程序已经运行后,用FindWindow找原程序主窗口的句柄,找到了,就发送•个口定义消息过去,而在原程序主窗口的消息处理函数中,只是调用Application.Restore方法,这样如果原程序是最小化的就会还原过來。在发送消息之后,紧接着我调用SetForegroundWindow并传入原程序主窗口的句柄,由于上而的处理,原程序肯定不是最小化了,且调用SetForegroundWindow的地方i_A经不是原程序/(

3、是第二次运行的程序,也可以说是另一个进程),所以原程序可以很好的被激活。看来一切都很好,当然不是,不然就不会有卜•面的代码了,我乂发现了一些问题,首先当主窗体不是活动窗口时,比如主窗体被隐藏了,而目前活动的窗体是其他窗体,则上面的代码无效。另一个,如果上窗体前面有一个ShowModal的窗体,则上“II的代码后,主窗体跑到ShowModal窗体的前面了。只有继续探索了,看来问题出在SetForegroundWindow_h,激活那个窗体都不好,因为那个窗体都有町能不在,有没有办法激活工程呢,我在Application中找方法,我找到Application.BringToFront,也许这个

4、有点用,丁是新建一个工程,加一个Timer控件,然后每隔3秒调用一次Application・BringToFront,运行看结果。可惜窗体仍然只是闪一下,并没有激活,这和我上面说的在自己进程屮激活自己的结果一样,口J能BringToFront方法里面也调用了SetForegroundwindow了吧,但它激活哪个窗口呢,这让我好奇,打开源码来看,看到了如下有代码:procedureTApplication•BringToFront;varTopWindow:HWnd;beginifHandle<>0thenbeginTopWindow:=GetLastActivePopup(Handle)

5、;if(TopWindow<>0)and(TopWindow<>Handle)andIsWindowVisible(TopWindow)andIsWindowEnabled(TopWindow)thenSetForegroundWindow(TopWindow);end;end;原来是用GetLastActivePopup这个API找到程序拥有的窗体中最近激活的窗体,然后再激活它。哈,我有了一个技术方案,首先我要在第二次运行的程序小找到第一次运行的程序的Application白勺Handle,然后调用SendMessage(APPHandle,WM_SYSCOMMAND,SC_RESTOR

6、E,0),Application类有处理这个消息的,最终它会调用Application.Restore方法,让自己变为显示的状态,即最大化或正常。接着,就执行上1们方法中的代码,让第一次运行的程序激活。现在关键是怎么找到第一次运行的Application的Handle,白然而然就想到了共享内存的技术,程序第一次运行时,先打开•一个内存映射文件,如果打不开,则表示程序第-•次运行,建•个内存映射文件对象,开辟一块共享的内存,这块内存保存Application的Handleo程序第二次运行,打开内存映射文件,可以打开了,得到一块共享内存,并取得了第一次运行程序的Application的Hand

7、le,然后,用我上面说的方法,即可大功告成。花了一个小时的试验,最终有了下面的代码,结果非常成功:unitwdRunOnce;*brief:让程序只运行一次*autor:linzhenqun*date:2005-12-28*email:linzhengqun@163.com*blog:http://blog•csdn•net/linzhengquninterface(*程序是否已经运行,如果运行则激活它*)functio

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。