| |
|
|
- Seite 1 - |
|
Walter | Hallo! Habe folgendes Problem: Ich möchte verhindern, dass in ein Eingabefeld Text hineinkopiert werden kann. Lösche dazu in meinem Programm die Zwischenablage mittels clearclip, sobald das Eingabefeld den Focus erhält. Das funktioniert. Doch scheint es trotzdem möglich zu sein, über ein anderes Programm einen Text (mittels DDE? ) in dieses Feld einzufügen. Ist das möglich? Wie kann ich das verhindern? |
|
|
| |
|
|
|
« Dieser Beitrag wurde als Lösung gekennzeichnet. » |
|
Matthias Arlt | Andere Möglichkeit: Edit subclassen und WM_PASTE abfangen
proc EditSubclass
parameters edit&, Msg&, wParam&, lParam&
set("FastMode",1)
if Msg& = 770''WM_PASTE
return
endif
return external("USER32","CallWindowProcA",owp&,edit&, Msg&, WParam&, LParam&)
set("FastMode",0)
endproc
declare owp&,edit&
cls
edit& = create("MultiEdit",%hwnd,"",100,30,200,100)
owp&=external("USER32","SetWindowLongA",edit&,-4, ProcAddr(EditSubclass,4))
while 1
waitinput
wend
Gruß Matthias |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 15.03.2020 ▲ |
|
|
|
|
|
p.specht
| Verstehe ich Dich richtig: Text soll aber weiterhin eingegeben werden können. Oder?
Mir fällt momentan nur der alte aus BASIC abgeleitete Befehl Input ein
cls:declare x$:print " Text: "; Input x$ print x$:waitinput:end
ein. In XProfan-11.2a kann man da nix aus der Zwischenablage reintun. Klappt einfach nicht! |
|
|
| Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 14.03.2020 ▲ |
|
|
|
|
Walter | Ja, ein Text soll eingegeben werden können. Es geht dabei um ein multiedit, in das auch ein längerer Text eingetragen werden kann. Allerdings soll nichts hineinkopiert werden können. Die Zwischenablage ist deshalb blockiert. Jetzt hab ich gesehen, es gibt z.B. einen "Clipboardmaster" [...] der Texte offenbar selbständig (ohne die Zwischenablage) in Felder eines anderen Programms transportiert. Könnte über DDE laufen (wird hier ja auch als Möglichkeit zum Fernsteuern beschrieben) - doch mein Programm soll sich eben gegen "Fernsteuern" / Text hineinkopieren wehren können. Also Anti-DDE, sozusagen... |
|
|
| |
|
|
|
Matthias Arlt | Andere Möglichkeit: Edit subclassen und WM_PASTE abfangen
proc EditSubclass
parameters edit&, Msg&, wParam&, lParam&
set("FastMode",1)
if Msg& = 770''WM_PASTE
return
endif
return external("USER32","CallWindowProcA",owp&,edit&, Msg&, WParam&, LParam&)
set("FastMode",0)
endproc
declare owp&,edit&
cls
edit& = create("MultiEdit",%hwnd,"",100,30,200,100)
owp&=external("USER32","SetWindowLongA",edit&,-4, ProcAddr(EditSubclass,4))
while 1
waitinput
wend
Gruß Matthias |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 15.03.2020 ▲ |
|
|
|
|
Walter | Von Subclassing hab ich bisher leider keine Ahnung. Nehme es aber gleich als Anlass, mich damit zu beschäftigen. Probiere ich heute noch aus! Danke! |
|
|
| |
|
|
|
Walter | Funktioniert bestens! Herzlichen Dank!
Jetzt muss ich es nur noch verstehen... |
|
|
| |
|
|
|
Matthias Arlt | Das ist eigentlich recht einfach. Beim Einfügen erhält das Edit-Control die Message WM_PASTE und die Fenster-Prozedur des Edit-Controls reagiert dann entsprechend darauf. Dies soll im konkreten Fall verhindert werden. Also tauschen wir die originale Fenster-Prozedur des Edit-Controls ganz einfach aus, lassen dort die Message WM_PASTE quasi unbehandelt. Für alle anderen Edit-Messages greift dann wieder die originale Fenster-Prozedur...
Gruß Matthias |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 15.03.2020 ▲ |
|
|
|
|
Walter | |
|
| |
|
|
|
E.T. |
proc EditSubclass
parameters edit&, Msg&, wParam&, lParam&
set("FastMode",1)
if Msg& = 770''WM_PASTE
return
endif
return external("USER32","CallWindowProcA",owp&,edit&, Msg&, WParam&, LParam&)
set("FastMode",0)
endproc
In dieser Prozedur wird aber der "FastMode" nie wieder abgeschaltet, da ja selbige immer vor set("FastMode",0) mit return verlassen wird |
|
|
| XProfan X3Grüße aus Sachsen... Mario WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte... | 15.03.2020 ▲ |
|
|
|
|
Matthias Arlt | Stimmt...das set("FastMode",0) ist an dieser Stelle wirkungslos und entbehrlich. Wichtig ist ja nur, daß set("FastMode",1) erforderlich ist, was wiederum [vor dem SubClassing] auch an anderer Stelle im Programm gesetzt werden kann...und ggf. auch sollte
Gruß Matthias |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 15.03.2020 ▲ |
|
|
|
|
Walter | Da ich bei den Windows Api-Aufrufen gar nicht durchblicke, habe ich inzwischen aus der Hilfe eine weitere Version mittels subclass, subclassproc und Set("WinProc", 0) zustande gebracht, die ebenfalls funktioniert:
Lt. Hilfe wird die SubClassProc defaultmäßig im FastMode aufgerufen, weswegen hier set("Fastmode",1) entfallen konnte.
Danke nochmals an Matthias für den Hinweis, dass das Problem mittels Subclassing zu lösen ist! |
|
|
| |
|
|