//关闭一个进程
int KillProcess(LPCSTR pszClassName, LPCSTR pszWindowTitle)
{
HANDLE hProcessHandle;
DWORD nProcessID;
HWND TheWindow;
TheWindow = ::FindWindowA(NULL, pszWindowTitle);
::GetWindowThreadProcessId(TheWindow, &nProcessID);
hProcessHandle = ::OpenProcess(PROCESS_TERMINATE, FALSE, nProcessID);
return ::TerminateProcess(hProcessHandle, 4);
}
void C多开Dlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
KillProcess(NULL, "某进程窗口标题");
HWND h = ::FindWindow(NULL, "某窗口标题");
if (h)
{
UpdateData(true);
if (m_ChangeGameCaption.GetBuffer() != NULL)
{
::SetWindowText(h, m_ChangeGameCaption);
}
}
}
1一般游戏为Laucher和client组成,Laucher设置了互斥Mutex无法多开,可以通过TerminateProcess关闭它。对于检测同名窗口防止多开,可以更改窗口标题。
2还可以通过遍历内核对象查找属于某进程的Mutex并关闭对应的句柄(CloseHandle)达到多开的目的。
3对于建立锁文件防多开的情况,一是找到锁文件做修改,二是拷贝游戏到另一个目录。
4调试程序到防多开的关键代码,跳过检测代码也可以实现。