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

作者:古典小说网 (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.exe


		BOOL 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;
		}
		else
			return;
	}

	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:// 父




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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清水迎朝阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值