Felipe Monteiro de Carvalho wrote:
On Mon, Jan 30, 2012 at 11:55 AM, Mark Morgan Lloyd
<[email protected]> wrote:
Thanks for that Felipe. So if I'm reading you correctly, as a crude hack I
should be able to start by hooking OnKeyDown etc. as exposed by (instances
of) descendants of TWinControl. But there's probably more ethical ways to do
it based on at least partial replacement of elements of the LCL.
Maybe I am missunderstand here, but you want to send keyboard events
from the hardware to the LCL application correct? If yes, then No, you
dont want to hook to OnKeyDown. OnKeyDown is what the control handles
(actually usually the KeyDown virtual method), but is not the first
step in the event chain.
If you want to simulate a keyboard you have to send LM_KEYDOWN /
LM_KEYUP and UTF8Char messages to controls. Convenience routines for
sending those messages are located in the unit lcl/LCLMessageGlue.pas
in these routines:
function LCLSendKeyDownEvent(const Target: TControl; var CharCode:
Word; KeyData: PtrInt; BeforeEvent, IsSysKey: Boolean): PtrInt;
function LCLSendKeyUpEvent(const Target: TControl; var CharCode: Word;
KeyData: PtrInt; BeforeEvent, IsSysKey: Boolean): PtrInt;
function LCLSendCharEvent(const Target: TControl; var CharCode: Word;
KeyData: PtrInt; BeforeEvent, IsSysKey, ANotifyUserInput: Boolean):
PtrInt;
function LCLSendUTF8KeyPress(const Target: TWinControl; AUTF8Char:
TUTF8Char; IsSysKey: Boolean): PtrInt;
So these are the routines you want to use for a LCL-only solution.
For a system wide solution you would need to figure out how to get
your keyboard messages to X11.
As a summary, at the level of an individual control (specifically,
synedit) hooking OnKeyDown and OnKeyUp and using those to toggle a flag
for the AltGr key (which my system at least lumps in with Alt as far as
the shift parameter is concerned) allows me to see the non-standard key
combinations. A lookup table converts to the applicable UTF-8
characters, which I can then inject using the target control's
IntfUTF8KeyPress(), noted your suggestion of LCLSendUTF8KeyPress() but
that's only available in trunk.
I've not yet investigated the behaviour of Solaris, which has a compose
key for dieresis etc.
--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk
[Opinions above are the author's, not those of his employers or colleagues]
--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus