为了避免重复打开程序,所以给了个提示
GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
sPath.ReleaseBuffer();
HANDLE m_hMutex = CreateMutex(NULL,TRUE,"CZvod.exe");
if (GetLastError()==ERROR_ALREADY_EXISTS)
{
if(IDOK==MessageBox("软件已在运行中!","提示",MB_OK))
{ ::SetForegroundWindow(this->m_hWnd); DWORD dwProcessID = ::GetCurrentProcessId(); //获取当前进程ID号
HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE,FALSE,dwProcessID); //根据进程ID返回对象句柄
::TerminateProcess(hProcess,0); //根据对象句柄结束进程
CloseHandle(hProcess);
}
}那怎么让他重复运行时弹出第一次运行的窗口?我用::Findwindow() 因为这个窗口的标题是一样,所以获取不到第一次运行的窗口
找到的话可以激活它 ::SetForegroundWindow(hWnd);
讨论题: 怎么实现打开一个文件获取它的进程ID?
GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
sPath.ReleaseBuffer();
HANDLE m_hMutex = CreateMutex(NULL,TRUE,"CZvod.exe");
if (GetLastError()==ERROR_ALREADY_EXISTS)
{
if(IDOK==MessageBox("软件已在运行中!","提示",MB_OK))
{ ::SetForegroundWindow(this->m_hWnd); DWORD dwProcessID = ::GetCurrentProcessId(); //获取当前进程ID号
HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE,FALSE,dwProcessID); //根据进程ID返回对象句柄
::TerminateProcess(hProcess,0); //根据对象句柄结束进程
CloseHandle(hProcess);
}
}那怎么让他重复运行时弹出第一次运行的窗口?我用::Findwindow() 因为这个窗口的标题是一样,所以获取不到第一次运行的窗口
找到的话可以激活它 ::SetForegroundWindow(hWnd);
讨论题: 怎么实现打开一个文件获取它的进程ID?
解决方案 »
- UDP 需要几个socket?
- 菜鸟求教!!!!!!!
- Com 编译时遇到的问题。请教解决。
- 如何控制编辑框输入数据的位数的啊?比如要输入的必须是5位,应该怎么办的?(在线等)
- vc中的统计函数
- 关于自定义消息的问题,有兴趣的朋友可以进来说说!
- 谁能告诉我有关文件格式的一些网站!!中英文均可!!谢谢
- oncreate 和precreatewindow各应该处理什么?我不知道该把函数放入那个消息里好
- CDialog接收不到自定义按钮的onclick事件
- 我写了一个拨号软件,但我想在里加入检查邮箱功能,但不知怎样写。请名位朋友指教!谢谢!
- 请教如何用VS2005制作安装包,使得安装包在安装的时候运行里面的批处理程序?
- WM_ACTIVATE 是什么东西发出的,为什么我在工程里搜索不到 WM_ACTIVATE,但是我的工程里有::OnActivate函数
同上在C***APP类的InitInstance()添加
然后查找窗口FindWindowEx查找第一个程序的窗口,然后ShowWindow、SetForegroundWindow即可。
#define APP_NAME _T("_MyAppName_")App类中增加成员变量HANDLE hMutex; // 互斥对象
App类的构造函数初始化hMutext变量,hMutext = NULL;
App类的InitInstance()
{
hMutex = CreateMutex(NULL, FALSE, APP_NAME);
if((NULL != hMutex) && (ERROR_ALREADY_EXISTS == GetLastError()))
{
HWND hWnd = ::GetWindow(::GetDesktopWindow(), GW_CHILD);
while(::IsWindow(hWnd))
{
if(::GetProp(hWnd, APP_NAME))
{
if(::IsIconic(hWnd))
{
::ShowWindow(hWnd, SW_RESTORE);
}
SetForegroundWindow(hWnd);
break;
}
hWnd = ::GetWindow(hWnd, GW_HWNDNEXT);
}
}
return FALSE;
}
重载APP类的ExitInstance()虚函数
{
if(NULL != hMutex)
{
CloseHandle(hMutex);
hMutex = NULL;
}
}在你的对话框类的OnInitDialog()或者SDI/MDI框架类的OnCreate()类加入语句:
::SetProp(GetSafeHwnd(), APP_NAME, (HANDLE)0x1);即可