Windows XP 存在已知 Bug:在「文字服務與輸入語言」設定中變更「輸入法開關」熱鍵後,無法將預設的 Ctrl+Space 恢復為開關鍵,只能在 Ctrl+Shift+Space 或 Alt+Shift+Space 中二選一。本文提供 Delphi 修復程式,直接修改登錄還原 Ctrl+Space 功能,經 XP SP2 實測有效。
XP 輸入法熱鍵設定儲存於登錄 HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys 下的子鍵 00000010 (對應「輸入法開/關」)。修改介面操作後,系統未正確寫入 Ctrl+Space 對應的二進位鍵值組合,導致無法在 UI 中選回。
直接向登錄鍵 Hot Keys\00000010 寫入 Key Modifiers 二進位值:02 C0 00 00,對應 Ctrl (0x02) + Space (虛擬鍵 0xC0 經映射)。

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Registry;
type
TForm1 = class(TForm)
btnFix: TButton;
procedure btnFixClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btnFixClick(Sender: TObject);
var
Reg: TRegistry;
KeyModifiers: array[0..3] of Byte;
begin
// 目標鍵值:Ctrl + Space 對應的修飾鍵組合
KeyModifiers[0] := $02; // MOD_CONTROL
KeyModifiers[1] := $C0; // VK_SPACE 相關映射
KeyModifiers[2] := $00;
KeyModifiers[3] := $00;
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CURRENT_USER;
// 開啟輸入法熱鍵設定鍵:00000010 = 「輸入法開/關」
if Reg.OpenKey('Control Panel\Input Method\Hot Keys\00000010', False) then
begin
Reg.WriteBinaryData('Key Modifiers', KeyModifiers, SizeOf(KeyModifiers));
ShowMessage('修復完成!已恢復 Ctrl+Space 切換輸入法熱鍵。'#13#10'請重新登入或重啟電腦生效。');
end
else
ShowMessage('無法開啟登錄鍵,請確認是否為 Windows XP 系統。');
finally
Reg.Free;
end;
end;
end.
HKEY_CURRENT_USER
└── Control Panel
└── Input Method
└── Hot Keys
├── 00000010 ← 「輸入法開/關」 (目標)
│ ├── Key Modifiers (BINARY) ← 修飾鍵組合
│ └── Virtual Key (BINARY) ← 虛擬鍵碼
├── 00000011 ← 「切換輸入語言」
└── ...
Hot Keys 分支以防萬一。Windows XP 歷史遺留的輸入法熱鍵 Bug 雖微小,卻嚴重影響慣用 Ctrl+Space 的使用者體驗。透過 Delphi 直接操作登錄寫入正確的 Key Modifiers 二進位值,繞過介面限制,即可完美恢復預設熱鍵功能。此技巧亦可延伸至其他熱鍵註冊鍵值的批次部署與修復。