中文输入法的热键

  • 主题发起人 主题发起人 import
  • 开始时间 开始时间
I

import

Unregistered / Unconfirmed
GUEST, unregistred user!
yanghaijun (1999-4-20 16:48:38) 哈,这个问题找我。
要知道WINDOWS的大部分秘密均在注册表中,一开注册表,万事大吉。
请查看_CURRENT_USERPanelMethodKeys
路径下,你会发现诸如:00000011、00000012等子键,每一子键代
表一种输入的热键,该子键有如下键值:
Key Modifiers : 用于指定功能转换键,如Alt、Shift或左Alt等
: 如alt,可能为 01 c0 00 00
Target IME : 用于指定具体的输入法,如 04 08 24 0e
Virtual Key : 用于指定字母键名,如3,则为 33 00 00 00
上面例子中指定了输入法04 08 24 0e的热键为alt+3。
而对于Taget IME的值,你可将其16进制值直接翻译成字符串,如
上例中的04 08 24 0e,变成e0240804,然后,你可据此进入另一个路径:
_LOCAL_MACHINElayouts
在此路径下你会找到一个子键e0240804,找到并打开它,你可看到如下的
键值:
IME file
layout file
layout text : 该输入法的显示名称,如“王码五笔型”
至此一切都明白了吗,你设置“王码五笔型”的热键为ALT+3。
这里你唯一难清楚的是Key Modifiers的值的获取方法,我也没时间
试,最多你在系统中设置不同的方式以检测其不同的取值,不会很多,组合
键有:Ctrl、Alt、Shift及左键、右键五个。
祝你好运!我的答案你可满意?
 
jghuang (1999-4-20 18:49:15)
啊!中午起了一个头,现在已经答得这么全了,白忙乎了半天
嘻嘻,还留了一点.^_^
关于Key Modifiers的值, 本人稍作分析,发现它作为一个32为二进制串,意义如下:
00000 1 1 1 1 1 000000 0000000000000000
^ ^ ^ ^ ^
shift ctrl alt 左 右
1:有,0:无.
祝你好运!我的有头有尾你可满意?
 
BOOL WINAPI ImmGetHotKey(DWORD dwHotKeyID, LPUINT lpuModifiers,
LPUINT lpuVKey, LPHKL lphKL)
uses
Menus, Imm, ShellApi, About;
function ImmGetHotKey(dwHotKeyID: DWord; var uModifiers: UINT;
var uVKey: UINT; var hKL: HKL): Boolean; stdcall; external 'Imm32.dll' Name 'ImmGetHotKey';
function HotKeyToStr(uModifiers, uVKey: UINT): string;
var
Shift: TShiftState;
begin
Shift := [];
if uModifiers and MOD_ALT <> 0 then Shift := Shift + [ssAlt];
if uModifiers and MOD_CONTROL <> 0 then Shift := Shift + [ssCtrl];
if uModifiers and MOD_SHIFT <> 0 then Shift := Shift + [ssShift];
if uModifiers and MOD_LEFT <> 0 then Shift := Shift + [ssLeft];
if uModifiers and MOD_RIGHT <> 0 then Shift := Shift + [ssRight];
Result := ShortCutToText(ShortCut(uVKey, Shift));
end;
procedure TSetImeForm.FormCreate(Sender: TObject);
const
nHKL_LIST = 20;
var
iImeCount, i, j, iImageIndex: Integer;
hImeList: array[1..nHKL_LIST] of HKL;
szImeFileName: array[0..MAX_PATH] of Char;
szImeName: array[0..254] of Char;
hLargeIcon, hSmallIcon: HICON;
Icon: TIcon;
uModifiers, uVKey: UINT;
hIme: HKL;
sHotKeys: string;
begin
ListView.Items.Clear;
iImeCount := GetKeyboardLayoutList(nHKL_LIST, hImeList);
for i := 1 to iImeCount do
if ImmEscape(hImeList, 0, IME_ESC_IME_NAME, @szImeName) > 0 then
begin
iImageIndex := -1;
ImmGetIMEFileName(hImeList, szImeFileName, MAX_PATH);
if ExtractIconEx(szImeFileName, 0, hLargeIcon, hSmallIcon, 1) <> 0 then
begin
Icon := TIcon.Create;
Icon.Handle := hSmallIcon;
iImageIndex := ImageList.AddIcon(Icon);
Icon.Free;
end;
with ListView.Items.Add do
begin
Caption := szImeName;
ImageIndex := iImageIndex;
if Caption = SysIni.ReadString(seUser, idDefaultIme, '五笔型码') then
Selected := True;
end;
end;
for i := IME_HOTKEY_DSWITCH_FIRST to IME_HOTKEY_DSWITCH_LAST do
if ImmGetHotKey(i, uModifiers, uVKey, hIme) then
for j := 1 to iImeCount do
if hIme = hImeList[j] then //First Ime is En, and has not name
ListView.Items[j - 2].SubItems.Add(HotKeyToStr(uModifiers, uVKey));
sHotKeys := '';
if ImmGetHotKey(IME_CHOTKEY_IME_NONIME_TOGGLE, uModifiers, uVKey, hIme) then
sHotKeys := sHotKeys + '打开关闭输入法' + ' ' + HotKeyToStr(uModifiers, uVKey) + #13;
if ImmGetHotKey(IME_CHOTKEY_SYMBOL_TOGGLE, uModifiers, uVKey, hIme) then
sHotKeys := sHotKeys + '切换中英文符号' + ' ' + HotKeyToStr(uModifiers, uVKey) + #13;
if ImmGetHotKey(IME_CHOTKEY_SHAPE_TOGGLE, uModifiers, uVKey, hIme) then
sHotKeys := sHotKeys + '切换全角和半角' + ' ' + HotKeyToStr(uModifiers, uVKey) + #13;
HotKeyList.Caption := sHotKeys;
end;
 
后退
顶部