写的进程通信子进程类,向子进程发送消息
来源:互联网 发布:淘宝店铺仓库管理 编辑:程序博客网 时间: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:// 父
子进程如何处理的,如何发送的和主进程差不多,主要是嫌麻烦,不想写了。呵呵
阅读全文
0 0
- 写的进程通信子进程类,向子进程发送消息
- pthread_kill向子进程发送信号函数
- 进程间的通信以及发送消息
- 经由管道父进程向子进程传送数据 | Unix进程间通信
- c# 使用SendMessage向另一进程发送WM_COPYDATA消息通信
- c# 使用SendMessage向另一进程发送WM_COPYDATA消息通信
- Linux间的进程通信;以及子进程的创建
- android子进程发送toast
- 父进程与子进程间的信号通信
- 父进程与子进程间通信的Queue问题
- 主进程与子进程的通信(handler)
- CreateProcess主进程与子进程管道通信的封装
- 子进程
- 子进程
- 子进程
- 进程与子进程
- 父进程 子进程
- 父进程子进程
- log4j是如何拖慢你的系统的
- xgboost使用自定义的loss function
- jquery .css 与.attr区别
- CSS 总结
- hadoop2.7+mahout0.13.0在数据集synthetic_control.data具体操作
- 写的进程通信子进程类,向子进程发送消息
- sqlite结合Kompex处理数据库
- 【剑指offer】旋转数组的最小数字
- SDK Tools 里没有CMake选项解决办法
- Android Studio里面的sync project with gradle files
- linux_yum的配置文件-repo文件
- Braintree 常见问题解决
- Topcoder 720 div2-C RainbowGraph
- 声明全局变量的三种方式