写的进程通信子进程类,向子进程发送消息

来源:互联网 发布:淘宝店铺仓库管理 编辑:程序博客网 时间:2024/05/29 10:56

作者:古典小说网 (gudianxiaoshuo.com)

头条:讨厌编程  、 古典古韵古典小说

作品:快乐课堂软件、任性动图软件、古典小说大全




#pragma once#define KalaOK_SetText 0#define KalaOK_CLOSE -100#define KalaOK_ShowWindow -105 //显示卡拉OK#define KalaOK_ShowWindowAndResetText -106#define KalaOK_HIDE -107 //隐藏struct ProcessWindow{DWORD dwProcessId;HWND hwndWindow;};//////// 查找进程主窗口的回调函数   //BOOL CALLBACK EnumWindowCallBack(HWND hWnd, LPARAM lParam)//{//ProcessWindow *pProcessWindow = (ProcessWindow *)lParam;////DWORD dwProcessId;//GetWindowThreadProcessId(hWnd, &dwProcessId);////// 判断是否是指定进程的主窗口   //if (pProcessWindow->dwProcessId == dwProcessId/* && GetParent(hWnd) == NULL*//*&& IsWindowVisible(hWnd) && GetParent(hWnd) == NULL*/)//{//pProcessWindow->hwndWindow = hWnd;////return FALSE;//}////return TRUE;//}class SubExe {public:SubExe() {hSubWnd = 0;}~SubExe() {}long hSubWnd;public:void SendData(CString sCopyData, int nData = 0) {if (hSubWnd == 0)return;SendCopyDataMsg(hSubWnd, sCopyData, nData);}void ShowWindow() {if (hSubWnd == 0)return;::SetForegroundWindow((HWND)hSubWnd);SendCopyDataMsg(hSubWnd, L"", KalaOK_ShowWindow);}void Hide() {if (hSubWnd == 0)return;SendCopyDataMsg(hSubWnd, L"", KalaOK_HIDE);}void SetText(CString sCopyData) {if (hSubWnd == 0)return;//::SetForegroundWindow((HWND)hSubWnd);SendCopyDataMsg(hSubWnd, sCopyData, KalaOK_SetText);}void ShowAndSetText(CString sCopyData) {if (hSubWnd == 0)return;::SetForegroundWindow((HWND)hSubWnd);SendCopyDataMsg(hSubWnd, sCopyData, KalaOK_ShowWindowAndResetText);}void Close() {if (hSubWnd == 0)return;SendCopyDataMsg(hSubWnd, L"", KalaOK_CLOSE);}void SendCopyDataMsg(long hWnd, CString sCopyData, int nData) {COPYDATASTRUCT cpd = { 0 };cpd.dwData = nData;//int cpd.cbData = sCopyData.GetLength() * 2 + 1;// 字符串    多加一个长度,防止乱码cpd.lpData = (void*)sCopyData.GetBuffer(cpd.cbData);HWND hDstWnd = (HWND)hWnd;::SendMessage(hDstWnd, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&cpd);}void CreateMyProcess(CString subExe){// 进程启动信息STARTUPINFO si;memset(&si, 0, sizeof(STARTUPINFO));si.cb = sizeof(STARTUPINFO);si.dwFlags = STARTF_USESHOWWINDOW;si.wShowWindow = SW_SHOW;// 进程信息PROCESS_INFORMATION pi;// 创建进程// 第二个参数是要启动的应用程序路径名,比如:C:\Test.exeBOOL bRet = ::CreateProcessW(subExe,NULL, //在Unicode版本中此参数不能为常量字符串,因为此参数会被修改    NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);if (bRet){ProcessWindow procwin;procwin.dwProcessId = pi.dwProcessId;procwin.hwndWindow = NULL;// 等待新进程初始化完毕WaitForInputIdle(pi.hProcess, INFINITE);//WaitForInputIdle(pi.hProcess, 5000)// 查找主窗口//EnumWindows(EnumWindowCallBack, (LPARAM)&procwin);//hSubWnd = (long)procwin.hwndWindow;}elsereturn;}void InitKalaOK(CString kalaOkPath, HWND hParentWnd){if (hSubWnd == 0)//if (g_nWindowHwnd == 0){CString exePath;if (PathFileExists(kalaOkPath)){CString lParntPath = kalaOkPath.Left(kalaOkPath.ReverseFind('\\'));CString iniPath;iniPath.Format(L"%s\\hWnd.ini", lParntPath);CString strHwnd;strHwnd.Format(L"%ld", hParentWnd);WritePrivateProfileString(L"Wnd", L"hParent", strHwnd, iniPath);CreateMyProcess(kalaOkPath);Sleep(100);if (PathFileExists(iniPath)){TCHAR szPath[266];CString regStr;GetPrivateProfileStringW(_T("Wnd"), _T("hWnd"), NULL, szPath, 267, iniPath);if (_tcslen(szPath) > 0){hSubWnd = _wtoi64(szPath);}}}}}};



使用示例:


SubExe m_KalaOkExe;


初始化时,开启自程序

CString KalaOkPath;KalaOkPath.Format(L"%scontrol\\Read\\Read.exe", g_strPath);m_KalaOkExe.InitKalaOK(KalaOkPath, m_hWnd);SetTimer(1, 2500, NULL);



延迟一毫米后,使子程序显示出来

//给子程序发送消息,子程序收到后,显示

OnTimer(UINT nIDEvent){CScrollView::OnTimer(nIDEvent);if (nIDEvent == 1) {KillTimer(nIDEvent);m_KalaOkExe.ShowAndSetText(L"卡拉OK朗读");return;}



m_KalaOkExe.Close();


进程通信处理子程序发来的消息

ON_MESSAGE(WM_COPYDATA, OnCopyData)//进程通信

OnCopyData(WPARAM wParam, LPARAM lParam){COPYDATASTRUCT* pCopyDataStruct = (COPYDATASTRUCT*)lParam;if (pCopyDataStruct){CString sCopyData = (LPWSTR)(pCopyDataStruct->lpData);int nData = pCopyDataStruct->dwData;switch (nData){case 0://仅设置文字   显示与隐藏 保持原样SetText(pCurrentBody, sCopyData);break;case -100:// 父




子进程如何处理的,如何发送的和主进程差不多,主要是嫌麻烦,不想写了。呵呵

原创粉丝点击