如何控制外部程序的输入 法?

chinestercn 2011-02-22 09:49:57
RT。
var c:hkl;
c:=GetKeyboardLayout(0);
immsimulateHotkey(mmo1.handle,IME_CHotKey_IME_NonIME_Toggle);
这样可以控制程序自身的输入法。
var
hpid,tid:dword;
tid:=GetWindowThreadProcessId(notepadhandle,@hpid);
c:=GetKeyboardLayout(tid);
immsimulateHotkey(mmo1.handle,IME_CHotKey_IME_NonIME_Toggle);
这样却不能控制记事本的输入法。

应该如何控制 外部程序的输入法呢。
...全文
105 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
kye_jufei 2011-02-23
  • 打赏
  • 举报
回复
---输入法截获与控制单元库---

unit DxImeOperControl;
interface
uses Windows,SysUtils,Messages,Classes,Imm,Controls,Forms;
type
 TDxImeControl = class;
 pControlRec = ^TControlRec;
 TControlRec = record
  LinkControl: TWinControl;
  OldWndProc: Pointer;
  OldWndMethod: TWndMethod;
  OwnIme: TDxImeControl;
 end;
 TImeChangeEvent = procedure(Sender: TObject;ImeControl: TWinControl;ImeName: string;ImeFileName: string;var AcceptChange: Boolean) of object;
 TImeKeyChangeEvent = procedure(Sender: TObject;ImeControl: TWinControl;KeyInputStr: string;CursorPos: integer;InResult: string)of object;
 TImeKeyResultEvent = procedure(Sender: TObject;ImeControl: TWinControl;InputResult: string) of object;
 TImeCandListOpenEvent = procedure(Sender: TObject;ImeControl: TWinControl;List: TStrings) of object;
 TNotifyInfo = (SetConversionModeInfo,OpenCandDateInfo,ChangeCandDateInfo,CloseCandDateInfo);
 {通知类型:全半角/中英文标点变化,进入选字,翻页,关闭选字列表}
 TImeNotifyEvent = procedure(Sender: TObject;NotifyInfo: TNotifyInfo) of object;
 TDxImeControl = class(TComponent)
 private
  FLinkHandle: THandle;
  FImc: HIMC;
  FLinkForm: TCustomForm;
  FOnImeActive: TNotifyEvent;
  FEnabled: boolean;
  FOnImeChange: TImeChangeEvent;
  FOnKeyInput: TImeKeyChangeEvent;
  FPageCount: Integer;
  FCurrentPage: Integer;
  CandList: TStringList;
  KeyBoardLayOut: Integer;
  FShowSoftKeyBoard: Boolean;
  FOnKeyInputed: TImeKeyResultEvent;
  FOnStartKeyInput: TNotifyEvent;
  FCurrentHwnd: THandle;
  FImeName: array[0..50] of char;
  FOnImeNotify: TImeNotifyEvent;
  FOnCandListOpen: TImeCandListOpenEvent;
  FShowOpenStatus: Boolean;
  FKeyListStr: string;
  procedure SetLinkHandle(const Value: THandle);
  function GetImeCompositonString: string;
  function GetImeResult: string;
  function GetImeOpen: Boolean;
  procedure SetLinkForm(const Value: TCustomForm);
  procedure SetEnabled(const Value: boolean);
  procedure RestoreLinkWndProc;
  procedure SetShowSoftKeyBoard(const Value: Boolean);
  procedure setCurrentHwnd(const Value: THandle);
  procedure SetShowOpenStatus(const Value: Boolean);
  function GetShowOpenStatus: Boolean;
  function GetImeName: string;
 public
  constructor Create(AOwner: TComponent);override;
  destructor Destroy;override;
  function SetInputIme(Control: TWinControl;ToImeFileName: string): Boolean;//设置输入法
  procedure SetIme(Control: TWinControl;AImeName: string);
  procedure SetCompositionString(Control: TWinControl;SetStr: string);//设定组字字符
  property InputStr: string read GetImeCompositonString;//获得正在输入的字符串
  property InputResult: string read GetImeResult;//获得输入的选字结果
  property LinkForm: TCustomForm read FLinkForm write SetLinkForm;//指定连接上哪个窗体,连接上的窗体都会被处理
  property Imc: HIMC read FImc;
  property ImeName: string read GetImeName;
  property ImeOpen: Boolean read GetImeOpen;
  property PageCount: Integer read FPageCount;
  property CurrentPage: Integer read FCurrentPage;
  procedure GetCandList(FCandList: TStrings;Page: Integer=0);//获得侯选字列表
  property CurrentHwnd: THandle read FCurrentHwnd write setCurrentHwnd;
  procedure ChangeToChinese(ChangeControl: TWinControl;ChangeChildren: Boolean=true;ToChinese: Boolean=true);
  procedure NextIme;
  property KeyListStr: string read FKeyListStr;
 published
  property Enabled: boolean read FEnabled write SetEnabled; //是否可用,捕获输入法消息
  property OnImeActive: TNotifyEvent read FOnImeActive write FOnImeActive;//输入法激活时触发
  property OnImeChange: TImeChangeEvent read FOnImeChange write FOnImeChange;//输入法改变时触发事件
  property OnKeyInput: TImeKeyChangeEvent read FOnKeyInput write FOnKeyInput;//输入时触发
  property OnKeyInputed: TImeKeyResultEvent read FOnKeyInputed write FOnKeyInputed;
  property OnStartKeyInput: TNotifyEvent read FOnStartKeyInput write FOnStartKeyInput;
  //property ShowSoftKeyBoard: Boolean read FShowSoftKeyBoard write SetShowSoftKeyBoard;//是否显示小键盘
  property OnImeNotify: TImeNotifyEvent read FOnImeNotify write FOnImeNotify;
  property OnCandListOpen: TImeCandListOpenEvent read FOnCandListOpen write FOnCandListOpen;
  property ShowOpenStatus: Boolean read GetShowOpenStatus write SetShowOpenStatus;
 end;
implementation
var
 WndList: TList;
end.
kye_jufei 2011-02-23
  • 打赏
  • 举报
回复

unit Unit1; 
  interface
  uses Windows,Messages,SysUtils,Classes,imm, Graphics,Controls,Forms,Dialogs,StdCtrls,Buttons,imm;
  typeTForm1=class(TForm)ComboBox1:TComboBox;BitBtn1:TBitBtn;BitBtn2:TBitBtn;
BitBtn3:TBitBtn;procedureFormShow(Sender:TObject);
procedureOpenIme(imename:string);procedurecloseIme;procedureComboBox1Change(Sender:TObject);procedureBitBtn1Click(Sender:TObject);procedureBitBtn2Click(Sender:TObject);procedureBitBtn3Click(Sender:TObject);
  private{Privatedeclarations}public{Publicdeclarations}end;
  varForm1:TForm1;
  implementation
  {$R*.DFM}


  procedureTForm1.FormShow(Sender:TObject);
varj:integer;beginforj:
=0toscreen.imes.count-
1dobeginComBoBox1.Items.Add(screen.Imes.strings[j]); //
获取系统中已安装的中文输入法end;end;
  procedureTform1.OpenIme(imename:string);
varI:integer;myhkl:hkl;beginifImeName<>'
'thenbeginifScr

....
een.Imes.Count<>0thenbeginI:
=screen.Imes.indexof(imename);
ifI>=0thenmyhkl:=hkl(screen.Imes.objects[i]);
activatekeyboardlayout(myhkl, KLF_ACTIVATE);//
设置相应的输入法end;end;end;
  procedureTForm1.closeime;varmyhkl:hkl;beginmyhkl:
=GetKeyBoardLayOut(0);ifImmIsIME(myhkl)then //
判断是否在中文状态,若是则关闭它immsimulateHotkey(handle,IME_CHotKey_IME_NonIME_Toggle);end;
  procedureTForm1.ComboBox1Change(Sender:TObject);
beginOpenIme(ComboBox1.Text);end;
  procedureTForm1.BitBtn1Click(Sender:TObject);
beginimmsimulateHotkey(handle,IME_CHotKey_shape_Toggle);//
切换半角和全角模式end;
  procedureTForm1.BitBtn2Click(Sender:TObject);
beginimmsimulateHotkey(handle,IME_CHotKey_symbol_Toggle);
//
切换中文标点模式和英文标点模式end;
  
  procedureTForm1.BitBtn3Click(Sender:TObject);
begincloseime;end;
  end.
bdmh 2011-02-22
  • 打赏
  • 举报
回复
首先tid应该为记事本中接收输入的edit的句柄,你可以通过spy++查看得到
再有mmo1.handle,已经不对了,应该是tid

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧