我像让我的程序 同时只能有应用程序的一个实例运行!
如果运行拉第二个实例的话 就显示第一个实例 并且退出第二个实例。我在OnInitDialog函数中加入下面代码
HANDLE HMutex=CreateMutex(NULL,false,"TheName");
if(HMutex && ERROR_ALREADY_EXISTS==GetLastError())
{
::SetWindowPos(第一个实例的窗口句柄,HWND_TOPMOST,283,173,458,400
,SWP_SHOWWINDOW);
exit(0);
}但是不知道怎么获取到第一个实例的窗口句柄,EnumWindows+GetWindowThreadProcessId 对比进程ID不行! 此时有2实例个进程啦! 并且如果第一个实例的窗口是隐藏的话 在EnumWindows中判断IsWindow也没用 因为我写的程序就是一个关于窗口隐藏的!
如果运行拉第二个实例的话 就显示第一个实例 并且退出第二个实例。我在OnInitDialog函数中加入下面代码
HANDLE HMutex=CreateMutex(NULL,false,"TheName");
if(HMutex && ERROR_ALREADY_EXISTS==GetLastError())
{
::SetWindowPos(第一个实例的窗口句柄,HWND_TOPMOST,283,173,458,400
,SWP_SHOWWINDOW);
exit(0);
}但是不知道怎么获取到第一个实例的窗口句柄,EnumWindows+GetWindowThreadProcessId 对比进程ID不行! 此时有2实例个进程啦! 并且如果第一个实例的窗口是隐藏的话 在EnumWindows中判断IsWindow也没用 因为我写的程序就是一个关于窗口隐藏的!
FindWindow,Win32 API函数。
FindWindow函数返回与指定字符创相匹配的窗口类名或窗口名的最顶层窗口的窗口句柄。这个函数不会查找子窗口。
函数原型:
HWND FindWindow
(
LPCTSTR lpClassName,
LPCTSTR lpWindowName
);
参数表:
lpClassName
指向一个以null结尾的、用来指定类名的字符串或一个可以确定类名字符串的原子。如果这个参数是一个原子,那么它必须是一个在调用此函数前已经通过GlobalAddAtom函数创建好的全局原子。这个原子(一个16bit的值),必须被放置在lpClassName的低位字节中,lpClassName的高位字节置零。
lpWindowName
指向一个以null结尾的、用来指定窗口名(即窗口标题)的字符串。如果此参数为NULL,则匹配所有窗口名。
返回值:
如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。
如果函数执行失败,则返回值为 NULL 。可以通过调用GetLastError函数获得更加详细的错误信息。
快捷信息:
导入库:user32.lib
头文件:winuser.h
HWND hWndPrev = ::GetWindow(::GetDesktopWindow(),GW_CHILD);
while(::IsWindow(hWndPrev))
{
//如果主窗口已最小化,则恢复其大小。
if (::IsIconic(hWndPrev))
::ShowWindow(hWndPrev, SW_RESTORE); //将应用程序的主窗口激活,弹到最上层.
::SetForegroundWindow(hWndPrev); //继续寻找下一个窗口。
hWndPrev = ::GetWindow(hWndPrev,GW_HWNDNEXT);
}
HWND hWndPrev = ::GetWindow(::GetDesktopWindow(),GW_CHILD);
while(::IsWindow(hWndPrev))
{
//如果主窗口已最小化,则恢复其大小。
if (::IsIconic(hWndPrev))
::ShowWindow(hWndPrev, SW_RESTORE);
else
::ShowWindow(hWndPrev, SW_SHOW); //将应用程序的主窗口激活,弹到最上层.
::SetForegroundWindow(hWndPrev); //继续寻找下一个窗口。
hWndPrev = ::GetWindow(hWndPrev,GW_HWNDNEXT);
}
HANDLE HMutex=CreateMutex(NULL,false,"MyWindows");
if(HMutex && ERROR_ALREADY_EXISTS==GetLastError())
{
::SetWindowPos(pMyWin->m_hWnd,HWND_TOPMOST,283,173,458,400
,SWP_HIDEWINDOW);
exit(0);
}