SendMessage & WM_COPYDATA
-
Hallo zusammen,
ich versuche hier gerade eine Konsolenanwendung zu "basteln", bei der ich einen String an das Anwendungsprogramm XYplorer schicken will.
ClassName eines solchen Fensters ist: ThunderRT6FormDC
Das gefundene window handle ist auch in Ordnung. Leider kommt bei XYplorer nichts an
Das hier ist mein Code:
#include "stdafx.h" #include <atlstr.h> #include <iostream> #include <windows.h> using namespace std; int main() { HWND hWnd = ::FindWindow(L"ThunderRT6FormDC", NULL); if (hWnd != NULL) { LPCTSTR strDataToSend = _T("::text 'test';"); COPYDATASTRUCT cpd; cpd.dwData = 4194305; cpd.cbData = sizeof(strDataToSend); cpd.lpData = &strDataToSend; ::SendMessage(hWnd, WM_COPYDATA, (WPARAM)(HWND)hWnd, (LPARAM)(LPVOID)&cpd); } else { TCHAR szBuff[64]; _stprintf(szBuff, _T("%p"), hWnd); MessageBox(NULL, szBuff, _T("Title"), MB_OK); } return 0; }
cpd.dwData benötigt exakt diesen Wert, da er für die Ausführung eines Scripts in XYplorer vorgesehen ist.
Hat jemand eine Idee, was ich hier falsch mache (abgesehen von der Warnung, die ich beim compilieren bekomme (_stprintf), das Programm läuft aber normal durch)?
Danke und Gruß!
-
LPCTSTR strDataToSend = _T("::text 'test';"); // ... cpd.cbData = sizeof(strDataToSend);
LPCTSTR
ist ein Zeigertyp. SolangestrDataToSend
ein Zeiger ist, ist hier dersizeof
-Operator höchstwahrscjeinlich falsch, denn die Größe in Bytes des Strings ist interessant und nicht die des Zeigers.Einfachste Lösung:
strDataToSend
ist ein Array.
-
Danke erstmal, EinGast!
Wenn ich das richtig verstehe müsste ich also lediglich die folgende Änderung vornehmen (also das Eine durch das Andere ersetzen):
LPCTSTR strDataToSend = _T("::text 'test';");
durch
char strDataToSend[] = "::text 'test';";
Was ich ausprobiert habe. Beim XYplorer kommt allerdings trotzdem (noch) nichts an. Entweder ich habs falsch verstanden, falsch umgesetzt oder es steckt noch ein Logikfehler im Code?
-
Probiere mal
TCHAR strDataToSend[] = _T("::text 'test';");
(da du ja anscheinend UNICODE aktivierst hast).
-
Großartig!
Ja, Unicode ist aktiviert und mit der Änderung empfängt XY die Daten
Wobei ich noch eine kleine Änderung brauchte:
cpd.cbData = sizeof(strDataToSend) - 1;
Damit ich die Nullbyte Terminierung nicht mitschicke (mit der kann XY nichts anfangen).
Noch eine (hoffentlich) kleine Sache: Der Prozess beendet sich nach dem Abschicken per SendMessage nicht von selbst, sondern wartet so lange, bis ich das aufpopende Fenster (durch "text 'test';) in XY schließe.
Kann man das noch ändern?
-
Dann probiere mal PostMessage.
-
Alles klar, danke noch mal!
-
Laut MSDN darf man
PostMessage
nicht fürWM_COPYDATA
benutzen.
Quelle, siehe Abschnitt Remarks.