#include "pch.h" #include "IDPMSDeamon.h" IMPLEMENT_DYNCREATE(IDPMSDeamon, CWinThread) BEGIN_MESSAGE_MAP(IDPMSDeamon, CWinThread) // {{AFX_MSG_MAP(DynamicTaskThread) // NOTE - the ClassWizard will add and remove mapping macros here. ON_THREAD_MESSAGE(WM_START_IDPMS, OnStartIDPMS) //}}AFX_MSG_MAP END_MESSAGE_MAP() IDPMSDeamon::IDPMSDeamon(void) { } IDPMSDeamon::~IDPMSDeamon(void) { } BOOL IDPMSDeamon::InitInstance() { return TRUE; } /************************************************************************************************** 函 数 名 :OnStartIDPMS 功能描述 :启动IDPMS进程 输入参数 :略 输出参数 :无 返 回 值 :void **************************************************************************************************/ void IDPMSDeamon::OnStartIDPMS(WPARAM wParam, LPARAM lParam) { STARTUPINFO si; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi)); BOOL bRet = CreateProcess(g_szIDPMSPath.GetBuffer(), NULL, NULL, NULL, false, 0, NULL, NULL, &si, &pi); if (!bRet) { AfxMessageBox("IDPMS启动失败"); LOG::E(_T("IDPMS启动失败")); return ; } PROCESS_INFO procwin; procwin.dwProcessId = pi.dwProcessId; procwin.hWnd = NULL; // 等待新进程初始化完毕 WaitForInputIdle(pi.hProcess, 5000); EnumWindows(EnumWindowCallBack, (LPARAM)&procwin); if (NULL == procwin.hWnd) { Sleep(200); EnumWindows(EnumWindowCallBack, (LPARAM)&procwin); } // 赋值全局量 g_hIDPMSHWnd = procwin.hWnd; //窗口HWND g_dwIDPMSProcessId = procwin.dwProcessId; //进程ID ::ShowWindow(g_hIDPMSHWnd, SW_HIDE); WaitForSingleObject(pi.hProcess, INFINITE); return; }