Autor: Jens-Arne Reumschüssel (---.77.8.pool.telefonica.de)
Datum: 01.07.22 16:22
Hallo,
ich habe öfter das Problem, dass bei bestimmten Controls (z.B. Buttons) beim Drücken von Enter WM_CHAR und WM_KEYDOWN nicht gesendet werden. D.h. man kann im Subclassing nicht auf das Drücken von Enter bei diesen Controls prüfen, was natürlich manchmal extrem ärgerlich sein kann.
Ich habe jetzt eine Lösung gefunden, die über einen Keyboard-Hook funktioniert. Vielleicht ist das ja für den einen oder anderen interessant.
declare hB%,ende%,enter%,hKbHook%
PROC KeyboardHookProc
parameters code&,wParam&,lParam&
declare i%,erg%
erg%=0 'Message weiterreichen und von anderen Hooks oder dem System bearbeiten lassen
if code&>=0 'sonst muss alles direkt an CallNextHookEx weitergereicht werden [https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/ms644984(v=vs.85)]
if wParam&=13 '13=~VK_RETURN
if @testbit(lParam&,31)=0 'keydown
if %getfocus=hB%
enter%=1
@sendmessage(%HWnd,$8000,0,0) 'waitinput verlassen
erg%=1 'Message *nicht* weiterreichen und von anderen Hooks oder dem System bearbeiten lassen
endif
endif
endif
endif
if erg%=0
return @external("USER32.DLL","CallNextHookEx",0,code&,wParam&,lParam&)
else
return erg%
endif
ENDPROC 'KeyboardHookProc
'Hauptprogramm
cls
usermessages $10,$8000 'Programmende, waitinput verlassen
hB%=@create("BUTTON",%HWnd,"Button",10,50,100,30)
@setfocus(hB%)
hKbHook%=@external("USER32.DLL","SetWindowsHookExA",2,@procaddr("KeyboardHookProc",3),0,@external("KERNEL32.DLL","GetCurrentThreadId")) '2=~WH_KEYBOARD
print "Enter drücken. Reagiert nur, wenn der Button den Fokus hat (das ist bei Pro-"
print "grammstart der Fall)."
enter%=0
ende%=0
whilenot ende%
waitinput
if %umessage=$10
ende%=1
elseif enter%
@messagebox("Enter auf Button gedrückt","Enter gedrückt",0)
enter%=0
endif
endwhile
@external("USER32.DLL","UnhookWindowsHookEx",hKbHook%)
end
Gruß, Jens-Arne
|
|