WM_PASTE + CEdit?
-
Hi!
Ich möchte verhindern, dass ein User über das Clipboard Text in ein Edit einfügt.
Nun habe ich habe gesehen, dass es die Nachricht WM_PASTE gibt und wollte damit die Eingabe über Strg-Einfg abfangen, aber ich kann sie nirgends im Klassen-Assi finden.
Bin ich (mal wieder
) irgendwie auf dem Holzweg?
Danke schonmal für Eure Eingebungen!Gruß T.
-
Du musst eigentlich in deinem Dialog die PreTranslateMessage überschreiben und dann bei WM_PASTE false zurückliefern, alle anderen Befehle musste an die CDialog::PreTranslateMessage weitergeben.
Inner MSDN ist AFAIK ein Beispiel dazu drin das recht leicht zu verstehen ist.
-
Also WM_PASTE ist bei PreTranslateMessage bei mir irgendwie nicht rauszufischen gewesen.
Jetzt habe ich es mit EN_UPDATE erledigt.
Mich stört einfach, dass man das CEdit mit dem Clipboard überlisten kann und trotz Begrenzung auf numerische Werte per Copy + Paste alles reinkopieren kann was man will. Das CEdit überprüft den Inhalt erst wieder bei UpdateData(TRUE) und setzt den gesamten Inhalt auf "0" wenn ein nicht-numerischer Wert gefunden wird. Das ist irgendwie nicht so klasse...
Ich finde EN_UPDATE eignet sich auch deshalb gut als Zeitpunkt zur Korrektur, weil es vor WM_PAINT kommt und das Auswechseln der Zeichen so kein Flackern im Control erzeugt.
Nun kann man reinkoperen was man will, wenn ein nicht-numerischer Wert dabei ist, wird auf "0" gesetzt, nun aber schon bei der Eingabe.void CMyDlg::OnUpdateNumericEdit() { CString strText; BOOL bIsNumeric = TRUE; CWnd* pCtrl = GetFocus(); pCtrl->GetWindowText(strText); TCHAR chTemp; int n, nMax = strText.GetLength(); for (n = 0; n < nMax; ++n) { chTemp = strText.GetAt(n); if ((int)chTemp < 48 || (int)chTemp > 57) bIsNumeric = FALSE; } if (!bIsNumeric) pCtrl->SetWindowText(_T("0")); }Danke trotzdem für Deinen Vorschlag!
Gruß T.
-
Also WM_PASTE ist bei PreTranslateMessage bei mir irgendwie nicht rauszufischen gewesen
BOOL MyDlg::PreTranslateMessage(MSG* pMsg){ if(pMsg->message == WM_PASTE).....
-
Die WM_PASTE Nachricht wird ja auch gesendet und nicht gepostet. Deshalb kommt sie dort niemals an.
-
aha, dann kann's damit ja auch nicht funzen.
Hatte nämlich genau Windalf's Code und es passierte genau gar nix...
Gruß T.
-
ach daher weht der wind...
na da wär ich dann wohl auch gut auf die schnauze geflogen...
-
.. schrieb:
Die WM_PASTE Nachricht wird ja auch gesendet und nicht gepostet. Deshalb kommt sie dort niemals an.
aha, kann man das vielleicht irgendwo nachlesen? bisher dachte ich da kommen einfach alle MSG durch und man kann dann die rausfischen die man haben möchte? Wie issn der unterschied zwischen gesendet/gepostet

-
CWnd::PreTranslateMessage
Used by class CWinApp to translate window messages before they are dispatched to the TranslateMessage and DispatchMessage Windows functions.
Wenn die Message gesendet wird (SendMessage), wird die WndProc direkt aufgerufen, ohne diesen Umweg.
-
aha! danke..
-
Windalf schrieb:
Also WM_PASTE ist bei PreTranslateMessage bei mir irgendwie nicht rauszufischen gewesen
BOOL MyDlg::PreTranslateMessage(MSG* pMsg){ if(pMsg->message == WM_PASTE).....ich denke am einfachsten wäre
BOOL MyDlg::PreTranslateMessage(MSG* pMsg){ if(pMsg->message == WM_PASTE) pMsg->message = NULL;
-
lol
-
Reticent schrieb:
Windalf schrieb:
Also WM_PASTE ist bei PreTranslateMessage bei mir irgendwie nicht rauszufischen gewesen
BOOL MyDlg::PreTranslateMessage(MSG* pMsg){ if(pMsg->message == WM_PASTE).....ich denke am einfachsten wäre
BOOL MyDlg::PreTranslateMessage(MSG* pMsg){ if(pMsg->message == WM_PASTE) pMsg->message = NULL;Wenn die WM_PASTE über die PreTranslateMessage() gehen würde könnte das schon sein
