Zeichen und Tastennachrichten darstellen
-
Das liegt daran, dass deine Zeigervariable pmsg
Siehe hier:// Definition: static PMSG pmsg; // Verwendung in deinem WM_KEYDOWN-Handler: pmsg.lParam=lParam;
vorher nicht mit einem gültigen Speicherbereich initialisiert wurde.
Du kannst entweder mit new/malloc Speicher allokieren, oder du verzichtest
hier vollständig auf den Zeiger (meines Erachtens die bessere Wahl ).
-
aha.
und wie weiß ich ihr zuerst einen gültigen Speicherbereich zu?
-
pmsg = new MSG;
oder eben gar keinen Pointer sondern so:
MSG msg;
Wenn du einen Pointer hast greifst du mit -> auf die Member zu, wenn du direkt eine Instanz / Struktur / etc. hast, dann nimmst du dazu .
Wobei ich bei deinem Beispielcode nicht so ganz verstehe, wozu du das mit der MSG-Struktur überhaupt machst und nicht gleich so:
GetKeyNameText(lParam, szKeyName, sizeof(szKeyName) /sizeof (TCHAR));
Zeichnen sollte man außerdem normalerweise nur in WM_PAINT...
-
ich machs mit dem pointer, damit ich das ein bisschen üben kann,
wie du siehst bin ich da noch ziemlich unsicher...wenn ich das mit new mach kommen folgende 4 Fehler/Warnungen:
C:\Programme\Microsoft Visual Studio\MyProjects\WinApi\Keylogger_v1\Keylogger_v1.c(56) : error C2065: 'new' : nichtdeklarierter Bezeichner C:\Programme\Microsoft Visual Studio\MyProjects\WinApi\Keylogger_v1\Keylogger_v1.c(56) : warning C4047: '=' : Anzahl der Dereferenzierungen bei 'struct tagMSG *' und 'int ' unterschiedlich C:\Programme\Microsoft Visual Studio\MyProjects\WinApi\Keylogger_v1\Keylogger_v1.c(56) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'MSG' C:\Programme\Microsoft Visual Studio\MyProjects\WinApi\Keylogger_v1\Keylogger_v1.c(56) : error C2275: "MSG" : Ungültige Verwendung dieses Typs als Ausdruck c:\programme\microsoft visual studio\vc98\include\winuser.h(1236) : Siehe Deklaration von 'MSG'
ich machs so:
static PMSG pmsg; //anderer Quelltext pmsg= new MSG; pmsg->lParam=lParam; //ausgabe: GetKeyNameText(pmsg->lParam, szKeyName, sizeof(szKeyName) /sizeof (TCHAR)); TextOut(hdc, 20,20, szBuffer,wsprintf(szBuffer, "%s", szKeyName));
-
flenders schrieb:
Wenn du einen Pointer hast greifst du mit -> auf die Member zu, wenn du direkt eine Instanz / Struktur / etc. hast, dann nimmst du dazu .
Ergänzend: Das wär auch noch möglich:
PMSG pMsg = new MSG; (*pMsg).lParam = ...; // oder wie flenders schon gesagt hat, mit dem Pfeiloperator: pMsg->lParam = ...;
Aber der Pfeiloperator bietet sich natürlich mehr als an :p .
PS: Was hast du für einen Compiler ?
-
ich hab Microsoft Visual C++
wieso?
-
roozy schrieb:
ich hab Microsoft Visual C++
Hm weil ich mich Frage, warum er 'new' nicht kennt...
Welche Version ?
-
6.0
-
Oh, jo ist klar....Fällt mir jetzt erst auf:
Du musst, wenn du C++ verwendest, als Dateiendung '*.cpp' angeben. Oder du benutzt malloc ( memory allocation). Das wäre C, ist aber natürlich 'etwas veraltet' .
-
ich tippe, du hast eine Datei .c und nicht .cpp und da new eben C++ ist musst du dem Compiler auch sagen, dass du das als C++ kompilieren willst (oder du verwendest eben malloc)
edit: zu langsmam...
-
4 Sekunden ...
-
mit malloc(sizeof(MSG)); hats super hingehauen.
danke nochmal an alle die mir geholfen haben
mfg