中国程序员联盟 正在重新改版中ing 不便之处还请见谅 改版后将内容涉及java delphi .net php
 
  首页 | 数据库开发 | 网络通讯 | 多线程 | 多媒体开发 | 图像处理 | 程序人生 | 系统函数 | 控件开发 | Web服务
 
  当前位置:笨鱼delphi技术网>系统函数>文章内容

delphi 中文输入法热键

来源:站内 关于:bill 发布时间:2007-06-27   [收藏] [推荐]

请查看\HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys
路径下,你会发现诸如: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,然后,你可据此进入另一个路径:
\HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Keyboard layouts
在此路径下你会找到一个子键e0240804,找到并打开它,你可看到如下的
键值:
    IME file
    layout file
    layout text  :  该输入法的显示名称,如“王码五笔型”
    至此一切都明白了吗,你设置“王码五笔型”的热键为ALT+3。
    这里你唯一难清楚的是Key Modifiers的值的获取方法,我也没时间
试,最多你在系统中设置不同的方式以检测其不同的取值,不会很多,组合
键有:Ctrl、Alt、Shift及左键、右键五个。
关于Key Modifiers的值, 意义如下:
00000  1        1       1       1      1     000000 0000000000000000
       ^        ^       ^       ^      ^
      shift   ctrl     alt     左     右
1:有,0:无.
/////////////////////////////////////////////////
设置默认输入法
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[i], 0, IME_ESC_IME_NAME, @szImeName) > 0 then
    begin
      iImageIndex := -1;
      ImmGetIMEFileName(hImeList[I], 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;


[浏览: 次]   
上一篇:delphi 获取桌面列表的句柄   下一篇:delphi 设置系统输入法
[收藏] [推荐] [返回顶部] [打印本页] [关闭窗口]  
    评论加载中…
google adsense热点文章
·delphi Delphi中ShellExecute的妙用
·delphi 如何快速读取文本文件
·delphi 如何判断输入值是否中文
·delphi 在应用层截获键盘消息
·delphi delphi实现服务开启与关闭
·delphi 实时记录事件日志
·delphi 使MEMO自动滚动
·delphi 如何区分键盘两个Enter键
·delphi 切换界面的方法
·delphi 汉字输入法的编程及使用
·delphi Delphi程序输入法自动切换最简
·delphi 程序缩小为任务右下角的小图标
     delphi技术网 | firefox 下载 | Avant Browser下载 | dedecms 技术网 | drupal 爱好者 | php 技术网
  Copyright@www.delphichm.com,2006-2009.All Rights Reserved.
 
程序员联盟 | delphi Java .net|QQ:707102932