今天学习的过程中遇到了一个问题: 记得学VB的时候遇到过防止程序重复执行的问题,当时的解决办法是检测app对象的PrevInstance的属性,如果为真说明在先前已经有一个实例了,为假则说明是第一次运行。代码如下:
- If App.PrevInstance Then
- End
- End If
这个代码在VB中很好用。
今天又遇到了同样的问题,不过环境变了。在学多线程编程的时候发现,这个功能在C写的Win32中是利用创建命名的互斥对象来实现的。原因是因为MSDN对WinMain参数hPrevInstance介绍的时候说的清楚,这个参数总为NULL,下面也说了如果要判断是否有另一个应用程序实例在运行的判断要通过创建命名的互斥对象来实现。在调用CreateMutex函数创建一个命名互斥对象后,如果其返回对象是一个有效的句柄,并且通过调用GetLastError函数返回ERROR_ALREADY_EXISTS那么就说明这个互斥对象已经创建过了,也就是说,已经有一个应用程序实例在先前已经运行过了。具体代码如下:
- HANDLE hMutex;
- hMutex=CreateMutex(NULL,FALSE,"app");
- if(hMutex)
- {
- if(GetLastError()==ERROR_ALREADY_EXISTS)
- ... //处理代码
- return
- }
那我就有一个疑问了,那VB内部是怎么处理地呢?难道不是通过调用WinMain?这个问题希望在日后深入的学习中找到答案。
今天又新认识了两个函数AdjustWindowRect和BringWindowToTop
AdjustWindowRect是根据指定的客户区返回一个用来创建窗口的大小,即包括客户区和非客户区的大小。
BringWindowToTop该函数将指定的窗口设置到Z序的顶部。如果窗口为顶层窗口,则该窗口被激活;如果窗口为子窗口,则相应的顶级父窗口被激活。注意:这个窗口与SetWindowPos不同的是,这个函数不能是一个窗口曾为顶层窗口。
如果应用程序不在前台中而想设置在前台中,可以调用SetForegroundWindow函数
关于这个SetForegroundWindow函数没用过,百度上介绍函数功能如下:
函数功能:该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。