Так что я как бы следовал этому:
https://msdn.microsoft.com/en-us/library/ms649009(v=vs.85).aspx
и это:
Используйте WM_COPYDATA для отправки данных между процессами
Для отправки данных между приложением openframeworks и нереальным движком 4.
Теперь все, кажется, хорошо, за исключением того, что я не могу понять, почему я получаю ошибку, что lParam не определен. Возможно, это что-то простое, но я не могу найти, как это сделать.
Итак, в нереальном движке 4 у меня есть актер, который отправляет сообщение каждые 10 секунд (в целях тестирования):
void ACOMActor::Tick( float DeltaTime )
{
Super::Tick( DeltaTime );
timer += DeltaTime;
if (timer > sendtime) {
timer = 0.f;
std::string string = "a message";
const wchar_t* wstring = new wchar_t[string.length() +1];
std::copy(string.begin(), string.end(), wstring);
SendWMCOPYDATA(wstring);
}
}
void ACOMActor::SendWMCOPYDATA(const wchar_t* string)
{
HWND WINAPI GetActiveWindow(void);
LPCTSTR lpszString = string;
COPYDATASTRUCT cds;
cds.dwData = 1;
cds.cbData = sizeof(TCHAR) * (_tcslen(lpszString) + 1);
cds.lpData = &lpszString;
SendMessage(GetActiveWindow(), WM_COPYDATA, (WPARAM)GetActiveWindow(), (LPARAM)(LPVOID)&cds);
GEngine->AddOnScreenDebugMessage(-1, 5.F, FColor::Green, FString::Printf(TEXT("Sending a message")));
}
Некоторый код все еще немного груб, но я просто пытался заставить его работать в первую очередь.
Я также создал код для получения сообщения в openframeworks. Я не совсем уверен, как это сделать, поэтому я добавил это в функцию обновления моего ofApp.cpp
void ofApp::update() {
GM->update();
PCOPYDATASTRUCT pMyCDS;
void WINAPI MyDisplay(LPSTR, LPSTR, DWORD);
pMyCDS = (PCOPYDATASTRUCT)lParam;
if (pMyCDS->dwData == 1)
{
LPCTSTR lpszString = (LPCTSTR)(pMyCDS->lpData);
cout << "receiving a message" << endl;
}
}
Так что это не работает, потому что lParam не определено. Я тоже пытался что-то сделать с
LRESULT CALLBACK WndProc (HWND hwnd, сообщение UINT, WPARAM wParam, LPARAM lParam)
Но я не знаком с этим и не уверен, как его использовать. Моя ошибка исчезла, но сообщение не было получено … Я использовал это так, вероятно, неправильно:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PCOPYDATASTRUCT pMyCDS;
void WINAPI MyDisplay(LPSTR, LPSTR, DWORD);
pMyCDS = (PCOPYDATASTRUCT)lParam;
if (pMyCDS->dwData == 1)
{
LPCTSTR lpszString = (LPCTSTR)(pMyCDS->lpData);
cout << "receiving a message" << endl;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
Любые советы, как этого добиться? Вероятно, это действительно просто, но я не могу найти никакой четкой информации. Спасибо!
Задача ещё не решена.
Других решений пока нет …