我不确定过去可能会起作用或可能发生了什么变化,但是像下面这样的东西应该起作用。这似乎WM_INPUTLANGCHANGE
是一条很容易出错的消息,几乎不可能通过覆盖WndProc
甚至挂钩 using来可靠地捕获(这里Application.HookMainWindow
有一篇关于它的不错的文章)。另请注意,这只是希伯来语键盘的一个示例 - 它不会捕获所有从右到左的键盘(如果需要,您显然需要添加它们)。
const HEBREW_KEYBOARD = $40D0000;
var gLangHook: HHOOK = 0;
function LangHookProc(Code: Integer; wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall;
begin
if (Code = HC_ACTION) and
(PCWPStruct(lParam)^.message = WM_INPUTLANGCHANGE) then
begin
if (PCWPStruct(lParam)^.lParam and $FFFF0000) = HEBREW_KEYBOARD then
Application.BiDiMode := bdRightToLeft
else
Application.BiDiMode := bdLeftToRight;
end;
Result := CallNextHookEx(gLangHook, Code, wParam, lParam);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
gLangHook := SetWindowsHookEx(WH_CALLWNDPROC, @LangHookProc, HInstance,
GetCurrentThreadId);
if gLangHook = 0 then
RaiseLastOSError;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if gLangHook <> 0 then
begin
UnhookWindowsHookEx(gLangHook);
gLangHook := 0;
end;
end;
在这里,我设置了应用程序的 BiDiMode - 如果所有孩子都有,ParentBiDiMode := true
那么所有控件都应该切换到从右到左模式。当然,你可以随心所欲地处理这个问题——我认为这是最难的部分。