游戏大厅原理:将其它exe界面程序嵌入自己的程序界面中运行

本文详细阐述了如何实现Windows游戏大厅效果,包括使用StartProcess和EnumWindows等函数的实践应用,解决过程中遇到的问题和遗留挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:
没有系统学习过Win32,对windows的shell效果经常惊讶。一直想实现这种游戏大厅的效果,但是总是不能深入。
昨天,偶然有幸进行了一次测试,花费了3个小时,终于搞清了其中的道理,现罗列如下,以敬同道中人。
成果:
HANDLE handle;//process handle
HWND apphwnd;//window handle

/*************Global functions for hosting******************/
//Function to enumerate all windows.
int CALLBACK EnumWindowsProc(HWND hwnd, LPARAM param)
{
  DWORD pID;
  DWORD TpID = GetWindowThreadProcessId(hwnd, &pID);//get process id
  if (TpID == (DWORD)param)
  {
    apphwnd=hwnd;//hwnd is the window handle
    return false;
  }
  return true;
}

//Functio to start a orocess and return the process handle
HANDLE StartProcess(LPCTSTR program, LPCTSTR args)
{
  HANDLE hProcess = NULL;
  PROCESS_INFORMATION processInfo;
  STARTUPINFO startupInfo;
  ::ZeroMemory(&startupInfo, sizeof(startupInfo));
  startupInfo.cb = sizeof(startupInfo);
  startupInfo.dwFlags = STARTF_USESHOWWINDOW;
  startupInfo.wShowWindow = SW_HIDE;
  if(::CreateProcess(program, (LPTSTR)args, 
     NULL,  // process security
     NULL,  // thread security
     FALSE, // no inheritance
     0,     // no startup flags
     NULL,  // no special environment
     NULL,  // default startup directory
     &startupInfo,
     &processInfo))
  { 
    Sleep(1000);
    ::EnumWindows(&EnumWindowsProc, processInfo.dwThreadId);//Iterate all windows
    hProcess = processInfo.hProcess;
  }
  return hProcess;
}

void CXXXXXDlg::OnButton1() 
{
  CRect rect;
  GetClientRect(&rect);
  handle=StartProcess("C:\\WINDOWS\\system32\\mspaint.exe","");
  if(apphwnd!=NULL)
  {
    ::SetParent(apphwnd,m_hWnd);
    SetWindowLong(apphwnd, GWL_STYLE, WS_VISIBLE);
    ::MoveWindow(apphwnd, rect.left, rect.top,rect.right, rect.bottom, true);
  }
  else
  {
    MessageBox("Cannot find Window");	
  }
} 
中间过程:

1、当时对ShellExecute情有独钟,CreateProcess还没有测试创建后立即隐藏的方式,所以当时希望也能通过ShellExecuteEx进行窗口的检索。

      这样必须从ShellExecuteEx得到的进程句柄中获取窗口,枚举、遍历后发现进程的ID唯一,但是进程每次打开后的句柄却各不相同。

     2小时后,不得不返回思路,重新考虑CreateProcess创建隐藏进程的方式。很快就发现可以行得通。

2、痛苦的过程总是令人痛苦不堪,只有经过痛苦的人,才能逐渐积累、减少痛苦,化悲痛为喜悦。

遗留问题:

如果碰到没有窗口句柄的程序,这种方式显然就不行了,该怎么办?

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值