我不確定過去可能發生了什麼或者可能發生了什麼變化,但是像下面這樣的東西應該可以工作。看起來WM_INPUTLANGCHANGE
是一個很滑的信息,幾乎不可能通過覆蓋WndProc
或者甚至使用Application.HookMainWindow
(它有一個像樣的文章here)可靠地捕獲。還要注意,這只是希伯來語鍵盤的一個例子 - 它不會捕獲所有從右到左的鍵盤(如果需要,您顯然需要添加它們)。
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
那麼所有的控制應該切換到從右到左的模式。當然,你可以處理這個,但你想 - 我認爲這是很難的部分。
Delphi 7或Delphi XE3中沒有TTextEdit或TMultiEdit;你試過那個「工作正常」是什麼?你談論「編輯模式」;您正在處理的控件中還有哪些其他模式? –
你是對的。我的意思是Delphi VCL中的TEdit和DevExpress中的TTextEdit/TcxMemo。簡而言之 - 每一個文本編輯器。 – Saurye