C++, ohne MFC, Entertaste im Textfeld erkennen

HansJ

Mitglied
Noch nicht erledigt ! C++, ohne MFC, Entertaste im Textfeld erkennen

In einer Anwendung sind Textfelder, in denen ich über die Tastatur Daten eingeben möchte.
Wenn ich einem Textfeld den Focus gebe, kann ich darin auch schreiben.
Aber ich kann nicht feststellen ob die Entertaste gedrückt wurde, damit das Feld wieder verlassen werden kann.
Bisher habe ich mit diesem Code experimentiert, der funktioniert aber nur wenn kein Textfeld den Focus hat.

LRESULT CALLBACK BasicScanProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if ( wParam == 13 )
{
bTest = TRUE; // Nur zum Test für einen Haltepunkt
return;
}

case WM_CHAR:
if ( wParam == CONTROL_Q )
{
PostMessage(hwnd,WM_CLOSE,0,0L);
return (TRUE);
}

swprintf(szTest,_T("%c"),wParam);
bTest = TRUE;
break;
....
 
Zuletzt bearbeitet:
Da musst du schon tiefer in die Trickkiste greifen, Stichwort Subclassing.
Du setzt dem Edit Control mittels SetWindowLong und GWL_WNDPROC eine eigene WindowProc rein; dabei unbedingt alle unbehandelten Nachrichten mittels CallWindowProc an die alte Proc weitergeben. Dann kannst du die Entertaste abfragen, bevor die Edit die bekommt (und bei Bedarf auch einfach nicht weitergeben).
 
Hallo,
in meinen Büchern habe ich nichts über SetWindowLong und GWL_WNDPROC gefunden. Bei MSDN nur auf den englischen Seiten und das hört sich sehr schwierig an.
Ist es möglich etwas mehr Hilfe zu bekommen ?
 
Im Grunde musst du irgendwo eine WindowProc für dein Edit haben:

WNDPROC pOldEditProc = NULL;

Code:
LRESULT MyEditProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{

  if ( ( uMsg == WM_KEYDOWN )
  && ( wParam == VK_RETURN ) )
  {
    // irgendetwas tun
  }

  return CallWindowProc( pOldWndProc, hwnd, uMsg, wParam, lParam );

}

Dann das Subclassen:
Code:
HWND  hwndMeinEdit = CreateWindow....

pOldWndProc = (WNDPROC)SetWindowLong( hwndMeinEdit, GWL_WNDPROC, (LONG_PTR)MyEditProc );

Nach diesem Aufruf laufen alle Messages, die das Edit zu sehen bekommt zuerst durch MyEditProc!

Hinweis: Für MyEditProc gilt dasselbe wie für alle anderen WindowProcs: Sie können keine Klassen-Member sein, es sei denn, sie sind statisch.
 
Noch nicht erledigt ! C++, ohne MFC, Entertaste im Textfeld erkennen

Leider habe ich da doch noch ein Problem.

In deinem Hinweis, glaube ich zu verstehen, reagierst du darauf das ein neues EditFeld erzeugt wird.

HWND hwndMeinEdit =CreateWindow....

In meiner Anwendung habe ich schon Edit Felder, wenn jetzt der Benutzer mit der Tab Taste oder ich den Focus in dieses Edit Feld setze möchte ich dann in die Subclass

MyEditProc springen um da die Eingaben abzufangen.

Leider habe ich nicht gefunden. Gibt es dazu eine Möglichkeit ?
 
Zuletzt bearbeitet:
Re: Noch nicht erledigt ! C++, ohne MFC, Entertaste im Textfeld erkennen

Wenn die Edit-Felder schon existieren ist der Ablauf genau gleich. Wo das HWND herkommt, ist völlig egal. In meinem Beispiel erzeuge ich ein Edit direkt und erhalte das HWND. Bei vorhandenen Edits kannst du dir ja über GetDlgItem das HWND holen (bzw. bei MFC dann noch GetSafeHwnd vom CWnd aus).

Du musst dir von deinen vorhandenen Edits das HWND besorgen und damit dann SetWindowLong aufrufen.
 
Zurück