判断一个程序是否启动,并给一个进程发送信息
#include "Switch2.h"
#include <tchar.h>
#include <psapi.h>
struct ProcessWindow
{
DWORD dwProcessId;
HWND hWnd;
};
BOOL CALLBACK EnumWindowCallBack(HWND hWnd, LPARAM lParam)
{
ProcessWindow *pProcessWindow = (ProcessWindow *)lParam;
DWORD dwProcessId;
GetWindowThreadProcessId(hWnd, &dwProcessId);
if (pProcessWindow->dwProcessId == dwProcessId && IsWindowVisible(hWnd) && GetParent(hWnd) == NULL)
{
pProcessWindow->hWnd = hWnd;
return FALSE;
}
return TRUE;
}
HWND GetProcessMainWnd(DWORD dwProcessId)
{
ProcessWindow wi;
wi.dwProcessId = dwProcessId;
wi.hWnd = NULL;
(EnumWindowCallBack, (LPARAM)&wi);
return wi.hWnd;
}
DWORD FindProcess(LPCTSTR modname, BOOL bAddExe)
{
DWORD aProcesses[1024];
DWORD cbNeeded;
DWORD cProcesses;
unsigned int i;
if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
{
return -1;
}
cProcesses = cbNeeded / sizeof(DWORD);
for (i = 0; i < cProcesses; i++)
{
if (aProcesses[i] != 0)
{
TCHAR name[_MAX_PATH];
TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]);
if (NULL != hProcess)
{
HMODULE hMod;
DWORD cbNeeded;
if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))
{
GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName) / sizeof(TCHAR));
std::wstring sModName = modname;
if (_tcsicmp(modname, szProcessName) == 0)
{
return aProcesses[i];
}
sModName += L".exe";
if (bAddExe && _tcsicmp(sModName.c_str(), name) == 0)
{
return aProcesses[i];
}
}
}
}
}
return 0;
}
typedef struct _MessageData
{
int channel;
int serialIndex;
} MessageData, *PMessageData;
void sendToDvs(int channel)
{
const wchar_t szDlgTitle[] = L"φ-OTDR ";
HWND hSendWindow = GetConsoleWindow();
if (hSendWindow == NULL)
{
return;
}
DWORD pid = FindProcess(L"TerminalPhi.exe", false);
TCHAR cmd[] = TEXT("..\\dvs\\TerminalPhi.exe");
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (pid <= 0)
{
CreateProcess(NULL, cmd, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);
pid = pi.dwProcessId;
}
HWND hRecvWindow = GetProcessMainWnd(pid);
if (hRecvWindow == NULL)
{
return;
}
MessageData messageData;
messageData.channel = channel;
messageData.serialIndex = m_port;
COPYDATASTRUCT copyData;
copyData.dwData = channel;
copyData.cbData = sizeof(MessageData);
copyData.lpData = &messageData;
SendMessage(hRecvWindow, WM_COPYDATA, (WPARAM)hSendWindow, (LPARAM)©Data);
}
};