头条:讨厌编程 、 古典古韵古典小说
作品:快乐课堂软件、任性动图软件、古典小说大全
#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:// 父
子进程如何处理的,如何发送的和主进程差不多,主要是嫌麻烦,不想写了。呵呵