DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: fdsafdsa1234
今日帖子: 1
在线用户: 5
导航: 论坛 -> 发布代码 斑竹:liumazi,ruralboy  
作者:
男 csf_csf (csf) ★☆☆☆☆ -
普通会员
2024/4/7 23:22:13
标题:
完整五笔外挂输入法delphi7源码 浏览:1389
加入我的收藏
楼主:     这个输入法是把别人的拼音改成五笔输入法了,加入了字库索引,大大减少了cpu利
用率,在单核cpu上利用率从98%下降到50%,可以应用了,这方面没有再修改.这个
输入法的特点是:            }
  1、输入字母直接按回车时可以直接输入英文.            
  2、按一下分号,再按字母键可以输入符号,比如∥,⊥,∠,à等。            }
  3、可以自己添加删除字词。                      
  4、可以自己添加删除符号。                      
  5、可以导入导出词库及符号库。                      
  6、右ctrl键是五笔与英文转换键,你可以把其它的内置拼音输入法打开,想用拼
     音输入法时,安下ctrl键就行。                      
                             
问题:              
     1、拼音部分没有完成,不可用。                    
如果你有好的建意和完善了代码,请发给我一份共同进步。                
                      
          2020年4月13日          

   修复了在输入法运行期间Page up pagedown 等安键失灵的问题 
          2022年10月19日
此帖子包含附件:csf_csf_202447232210.zip 大小:2.44M
----------------------------------------------
-
作者:
男 csf_csf (csf) ★☆☆☆☆ -
普通会员
2024/4/7 23:25:24
1楼: 界面
此帖子包含附件:
PNG 图像
大小:9.2K
----------------------------------------------
-
作者:
男 yxsoft (yxsoft) ★☆☆☆☆ -
盒子活跃会员
2024/4/8 0:14:13
2楼: 下载收藏,支持!
----------------------------------------------
Great!
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2024/4/8 1:32:14
3楼: 什么叫做“外挂输入法”?它依赖别的输入法吗?
另外说“如果你有好的建意和完善了代码,请发给我一份共同进步”,可否把邮件留下?
----------------------------------------------
只有偏执狂才能生存!
作者:
男 csf_csf (csf) ★☆☆☆☆ -
普通会员
2024/4/8 8:25:08
4楼: 外挂输入法不依赖其他输入法,外挂输入法就是一个小程序,运行过程大概就是,实行输入共享-->用钩子判断按键-->查表-->输出到指定位置,需要自行打开运行,不会和正常输入法一样整合到系统。代码里有邮箱。
----------------------------------------------
-
作者:
男 dalas (dalas) ★☆☆☆☆ -
普通会员
2024/4/8 20:35:02
5楼: 用XE12.1编译,输入 kwwl,结果是乱码。
此帖子包含附件:
PNG 图像
大小:12.7K
----------------------------------------------
-
作者:
男 csf_csf (csf) ★☆☆☆☆ -
普通会员
2024/4/8 21:04:42
6楼: @dalas
此源码是delphi7的,应该是数据错位了,看你输出的不够14个字符,正常打kwwl输出的是7个汉字14个字符才正确,你微调一下,修改一下song()和song2()函数,估计delphi12中没有string类型。
----------------------------------------------
-
作者:
男 lyp8899 (lyp8899) ★☆☆☆☆ -
盒子活跃会员
2024/4/9 10:36:17
7楼: 如果一个程序窗口设成TOPMOST,五笔输入框就隐藏在程序后面看不见了
----------------------------------------------
▄︻┻┳═
作者:
男 szlbz (秋风) ★☆☆☆☆ -
盒子活跃会员
2024/4/9 11:39:21
8楼: 5楼的问题估计和编码有关
----------------------------------------------
-
作者:
男 csf_csf (csf) ★☆☆☆☆ -
普通会员
2024/4/9 16:43:21
9楼: 7楼的问题可以在每次按键消息中设置一下窗口最前应该能解决。
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2024/4/9 18:46:33
10楼: 楼主这套代码就是给个思路吧,没太仔细看,不过警告很多,写的应该很随意。
----------------------------------------------
--
作者:
男 csf_csf (csf) ★☆☆☆☆ -
普通会员
2024/4/10 8:47:46
11楼: @bahamut8348 (leonna)
不怎么完整,还有一些小bug,也不够智能.外挂的输入法,大概就是这么回事吧,谁有ime的代码,就是一个空壳也行,可以发出来,我研究一下.delphi这方面的代码太少了.只有一个刘麻子老师写的有公开代码,是一个区位输入法,看了一段时间,改不动.水平有限,我自学的delphi,只是个爱好.
----------------------------------------------
-
作者:
男 lzplzp001 (疯之子) ★☆☆☆☆ -
盒子活跃会员
2024/4/10 10:47:19
12楼: 多多输入法不知道你们听过没有。
不过现在这种没有意义了,微软自带的五笔就很好用了
----------------------------------------------
-
作者:
男 think1994 (小白) ▲△△△△ -
普通会员
2024/4/10 11:06:08
13楼: 我昨天移植到Delphi 12,主要工作是字符串类型转换。编译没问题,可以运行。问题是文字内码不对,导致显示的字不对
----------------------------------------------
-
作者:
男 csf_csf (csf) ★☆☆☆☆ -
普通会员
2024/4/10 12:27:44
14楼: @think1994 (小白)
注释掉的地方,是我测试时设置的,你可以打开,一步一步的查找原因,这段代码是N年前的东西,对高手而言,确实没什么意义了.
重点修改这个地方:
if str<>'' then
    begin
      tint:=StrNum(str,',');
      if (tint>1) and (tint<1001) then
        begin
          while Length(str)>0 do   //根据解码所得顺序取出所对应的字词
          begin
          j:=StrToInt(Copy(str,1,FindStr(str,',')-1));
          if tstr<>'' then
          begin
          if Inputtype=0 then
          begin
          tstr:=tstr+' '+IntToStr(v)+' '+zw.Strings[j];
          end
          else if Inputtype=1 then
          begin
          tstr:=tstr+'^ '+IntToStr(v)+'^ '+zdfhz.Strings[j];
          end;
          v:=v+1;
          end
          else
          begin
          if Inputtype=0 then
          begin
          tstr:='1 '+zw.Strings[j];
          end
          else if Inputtype=1 then
          begin
          tstr:='^1 '+zdfhz.Strings[j];
          end;
          v:=v+1;
          end;
          str:=Copy(str,FindStr(str,',')+1,(length(str)-FindStr(str,',')));
          end;
        end
      else if tint=1 then
        begin
          if Inputtype=0 then
          begin
          tstr:=zw.Strings[StrToInt(copy(str,1,length(str)-1))];
          end
          else if Inputtype=1 then
          begin
          tstr:=zdfhz.Strings[StrToInt(copy(str,1,length(str)-1))];
          end;
       end
      else if tint>1000 then Exit;
    end
  else Exit;// 汉字编码查找结束
  end;
    if tstr<>'' then
     s2:=Trim(tstr);

  if s2<>'' then
     t[1]:=s2
  else
     exit;

  if HasNum(s2) then
     begin
       if ((ord(s2[i])<48) or (ord(s2[i])>57)) then
          ok:=0;n:=0;
       for i:=1 to length(s2) do
        begin
          if s2[i]=' ' then
          begin
          ok:=1-ok;
          if ok=1 then
          begin
          n:=n+1; max:=n; t[n]:='';
          end;
          end;
          if (((ord(s2[i])<48) or (ord(s2[i])>57))) and (s2[i]<>' ') then
          begin
          tn:=n;
          try
          t[n]:=t[n]+s2[i];
          except
          end;
          end;
        end;
       //messagebox(0,pchar(t[1]+t[2]+t[3]+t[4]),'提示:',0);--->这是测试用的代码, 
     end;
  Label1.Text:='';
  if tint< 2 then
    begin
      if Inputtype=0 then
        begin
          Width:=301;
          Label1.Width:=283;
          StaticText1.Width:=143;
          RzBitBtn3.Left:=278;
          RzBitBtn4.Left:=278;
        end;
      Height:=72;
      label1.Lines.Add(s2);
      RzBitBtn3.Enabled:=False;
      RzBitBtn4.Enabled:=False;
    end
  else
    begin
      if tint>9 then
         begin
          for i:=1 to 9 do
          label1.Lines.Add(inttostr(i)+t[i]);
          label1.Height:=abs(label1.Font.Height-4)*(9+round(label1.Font.Size*0.15));//
          Height:=label1.Height;
         end
      else
         begin
          for i:=1 to tint do
          label1.Lines.Add(inttostr(i)+t[i]);
          label1.Height:=abs(label1.Font.Height-4)*(tint+round(label1.Font.Size*0.12)); //
          Height:=rzbitbtn1.Height+label1.Height; //
         end;
      //messagebox(0,pchar(s1),'提示:',0); //调试用
      BitMap:= TBitMap.Create;
      try
        with BitMap.Canvas do
         begin
          X:=trunc(TextWidth(Label1.Text)*0.65);

         end;
      finally
        BitMap.Free; 
      end;
      if (label1.Width)<(X) then
         begin
          if Inputtype=0 then
          Width:=x+rzbitbtn3.Width
          else
          Width:=X+(RzBitBtn4.Width-8);
          StaticText1.Width:=StaticText1.Width+(X-Label1.Width+2);
          label1.Width:=X;
          RzBitBtn4.Left:=label1.Left+label1.Width-2;
          RzBitBtn3.Left:=label1.Left+label1.Width-2;
         end;
      RzBitBtn3.Enabled:=False;
      if tn>9 then
        RzBitBtn4.Enabled:=True
      else
        RzBitBtn4.Enabled:=False;
    end;
    if (label1.Lines.Count=1) and (cishu=4) then
    begin
      song(t[1]);
      statictext1.Caption:='落寞惊梦';
    end;
    //messagebox(0,pchar(inttostr(label1.Lines.count)),'提示:',0); //调试用
end;
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2024/4/11 4:49:46
15楼: delphi其实不适合用来创建ime程序,因为其中涉及到驱动,太过麻烦了。
至于说一个空壳嘛,可以看一看这个:
https://www.cnblogs.com/cnpler/archive/2012/03/19/2405433.html

或者找找C/C++的源码,那样范围会大很多。包括android的输入法都可以找到
----------------------------------------------
--
作者:
男 abcjingtong (jingtong) ★☆☆☆☆ -
普通会员
2024/4/11 16:52:14
16楼: 微软的输入法有2种开发方式,一种是旧的方式,就是dll导出那十几个函数(并不是所有的函数都需要有逻辑,就几个比较重要需要写逻辑),另一种是新的方式。这种东西一但跑通后,发现数据整理才是最大头的工作。
----------------------------------------------
18114532@qq.com
作者:
男 wswzbak2011 (wswz) ▲▲△△△ -
普通会员
2024/4/14 13:43:33
17楼: 在delphixe11 中调试通过

在delphi2009 以后 统一了unicode,string 默认unicode 和Delphi7的string不同。汉字不用处理两个字节的问题了 把song()函数中 改成这样
while i<= Length(s) do
    begin
     { ch:=byte(s[i]);
      if Windows.IsDBCSLeadByte(ch)then
        begin
          Inc(i);

          SendMessage(f3,WM_IME_CHAR,MakeWord(byte(s[i]),ch),0);
        end
      else
        begin
          SendMessage(f3,WM_IME_CHAR,word(ch),0);
        end;
      Inc(i);
     }
     SendMessage(f3,WM_IME_CHAR,Integer(s[i]),0);
     i:=i+1;

    end;
这样 就解决了 乱码的问题。

2 菜单显示不全 把退出和半角的transparent 改成 false
3 用钩子容易造成 冲突,一些软件屏蔽了钩子。所以钩子程序应该更精巧,还有改进的余地。
4 这个以后可以考虑 把编码 直接挂sqllite 数据库,可以挂任何编码,利于维护应该更好。
5 定位还有问题
此帖子包含附件:
JPEG 图像
大小:32.1K
----------------------------------------------
-
作者:
男 csf_csf (csf) ★☆☆☆☆ -
普通会员
2024/4/15 0:09:12
18楼: @ wswzbak2011 (wswz)
挂数据库确实可行,并且可以加入智能筛选输入频率的代码,使输入频率越高的字词越靠前排列。
----------------------------------------------
-
作者:
男 csf_csf (csf) ★☆☆☆☆ -
普通会员
2024/4/15 0:19:37
19楼:  @bahamut8348 (leonna)
delphi确实不适合编输入法,只是不适合,并不是不能,就是和别的比起来比较麻烦些。
----------------------------------------------
-
作者:
男 jwj76 (禁卫) ▲△△△△ -
普通会员
2024/4/15 20:07:45
20楼: 如何在Lazarus中使用
----------------------------------------------
-
作者:
男 wswzbak2011 (wswz) ▲▲△△△ -
普通会员
2024/4/16 19:30:35
21楼: 全平台开源输入法 rime 这个还不错
----------------------------------------------
-
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2024/4/19 22:17:08
22楼: IME实际就是个DLL,PE文件标志是驱动而已,checksum也要校验好
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 qq81709989 (战石电子) ▲▲△△△ -
普通会员
2024/4/20 9:21:40
23楼: 开发微软Windows操作系统的输入法,主要有两种方式:基于传统的Input Method Editor (IME) 模式和基于Text Service Framework (TSF) 模式。

1. **基于IME模式的开发**:IME是微软早期为Windows操作系统提供的一套输入法编程规范。开发者需要遵循IME框架,使用IMM32.DLL提供的功能来创建输入法。这种方式主要应用于Windows 95至Windows 7等旧版本的Windows操作系统。IME模式的输入法开发涉及到处理键盘输入、编码转换、候选词展示等多个方面,并且需要导出特定的API接口供系统调用。

2. **基于TSF模式的开发**:TSF是微软在Windows Vista及以后版本中引入的更现代的文本服务框架,它提供了更丰富的API和更灵活的编程模型,支持高级文本输入和自然语言技术。开发者可以利用TSF框架创建更复杂的输入法,包括多语言支持、手写识别、语音识别等文本服务。TSF模式的输入法开发需要实现特定的COM组件和接口,如ITfTextInputProcessor等,并且需要注册DLL和输入法Profile。

这两种开发方式各有特点,IME模式适用于旧版Windows系统,而TSF模式则适用于新版Windows系统,并且提供了更多的功能和更好的用户体验。开发者可以根据目标用户群体和开发需求选择适合的开发方式。
Delphi 是一种高级的编程语言,它可以用来开发基于 Text Service Framework (TSF) 的输入法。然而,由于 Delphi 并非直接支持 COM 组件开发,且 TSF 主要与 C++ 相关联,因此使用 Delphi 开发 TSF 输入法并不常见,也相对复杂。不过,理论上是可行的,因为 Delphi 可以调用 Windows API,并且可以创建 COM 组件。

下面是一个非常基础的示例,展示如何在 Delphi 中开始创建一个简单的 TSF 输入法框架。请注意,这只是一个起点,实际的输入法开发需要更深入的编码和对 Windows TSF 文档的详细了解。

library MyTSFIME; // 你的输入法 DLL 名称

uses
  Windows, ActiveX, TlHelp32;

// 定义一些必要的 COM 对象和接口
type
  ITfTextInputProcessor = interface;
  ITfThreadMgr = interface;
  ITfClientId = interface;

  ITfTextInputProcessor = interface(IUnknown)
  ['{00000000-0000-0000-C000-000000000046}']
    // 定义 Activate 和 Deactivate 方法等
  end;

  ITfThreadMgr = interface(IUnknown)
  ['{00000120-0000-0000-C000-000000000046}']
    // 定义相关方法
  end;

  ITfClientId = interface(IUnknown)
  ['{00000131-0000-0000-C000-000000000046}']
    // 定义相关方法
  end;

  // DLL 入口点
function DllMain(HInstance: HINST; Reason: DWORD; pvReserved: Pointer): BOOL; stdcall;
begin
  Result := True;
  // 根据 Reason 进行相应的初始化或清理工作
end;

// 标准 DLL 导出函数
function DllGetClassObject(const CLSID: TCLSID; const IID: TIID; out Obj): HResult; stdcall;
begin
  // 实现 COM 组件的注册和实例化
  Result := E_FAIL;
end;

function DllCanUnloadNow: HResult; stdcall;
begin
  // 检查是否可以卸载 DLL
  Result := S_OK;
end;

// 导出函数,用于注册和撤销注册 DLL
function DllRegisterServer: HResult; stdcall;
begin
  // 实现注册逻辑
  Result := S_OK;
end;

function DllUnregisterServer: HResult; stdcall;
begin
  // 实现撤销注册逻辑
  Result := S_OK;
end;

// 你的输入法 COM 对象的实现
type
  TMyInputProcessor = class(TInterfacedObject, ITfTextInputProcessor)
  private
    FClientId: TfClientId;
  public
    constructor Create;
    destructor Destroy; override;
    // 实现 ITfTextInputProcessor 接口的方法
    function Activate(pThreadMgr: ITfThreadMgr; var tfClientId: TfClientId): HResult; stdcall;
    function Deactivate: HResult; stdcall;
  end;

// 实现 TMyInputProcessor 类
constructor TMyInputProcessor.Create;
begin
  inherited Create;
  // 初始化你的输入法处理器
end;

destructor TMyInputProcessor.Destroy;
begin
  // 清理工作
  inherited;
end;

function TMyInputProcessor.Activate(pThreadMgr: ITfThreadMgr; var tfClientId: TfClientId): HResult; stdcall;
begin
  // 实现激活输入法逻辑
  Result := S_OK;
end;

function TMyInputProcessor.Deactivate: HResult; stdcall;
begin
  // 实现停用输入法逻辑
  Result := S_OK;
end;

exports
  DllMain,
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer;

begin
  // DLL 初始化代码
end.

```

请注意,这个代码只是一个框架示例,它没有实现具体的逻辑,并且缺少了很多必要的细节。真正的 TSF 输入法开发需要处理文本输入、编辑、候选词展示、用户界面创建和管理等多个方面的复杂逻辑。如果你不熟悉 COM 和 Windows 文本服务框架,可能需要花费大量的时间来学xi和实现。
----------------------------------------------
《Z-Gantt战石智慧时间管理进度计划甘特图软件》:WWW.Z-SHi.NET
作者:
男 dalas (dalas) ★☆☆☆☆ -
普通会员
2024/4/20 14:41:41
24楼: 微软也真是,一个输入法而已,搞这么复杂。
----------------------------------------------
-
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2024/4/20 19:57:56
25楼: 由于 Delphi 并非直接支持 COM 组件开发??? 我都看傻了。
----------------------------------------------
只有偏执狂才能生存!
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行98.63281毫秒 RSS