如何关闭系统激活的输入法及由自身程序送字到相应窗口?(100分)

  • 主题发起人 yellowrose
  • 开始时间
Y

yellowrose

Unregistered / Unconfirmed
GUEST, unregistred user!
我正在进行一个用自己程序替代WIN95输入法的程序,
目前遇到以下问题:
1。如何关闭系统在由键盘热键激活或鼠标点击激活
的标准输入法?
2。如何由自身程序已获得的字送到相应的窗口?

此问急征答案,到12/18前有效。
 
1. 在 Windows 95 您可以用 GetKeyboardLayout() (export From User32)取得
keyboard Layout 的 Handle ,传入ImmIsIME() 函数(export from IMM32.DLL)侦测输入法(IME, Input Method Editor);(钱达智先生)
2.要用HOOK.考完试让我试试:)
 
给你两个函数.SetmyIme用于设置,ResetIme用于恢复.

procedure SetmyIme(ImeName:string);
var
I: Integer;
HandleToSet: HKL;
begin
if not SysLocale.FarEast then Exit;
if ImeName <> '' then
begin
if (AnsiCompareText(ImeName, Screen.DefaultIme) <> 0)
and (Screen.Imes.Count <> 0) then
begin
HandleToSet := Screen.DefaultKbLayout;
I := Screen.Imes.IndexOf(ImeName);
if I >= 0 then
HandleToSet := HKL(Screen.Imes.Objects);
ActivateKeyboardLayout(HandleToSet, KLF_ACTIVATE);
end;
end;
end;

procedure ResetmyIme(ImeName:string);
begin
if not SysLocale.FarEast then Exit;
if ImeName <> '' then
begin
if AnsiCompareText(ImeName, Screen.DefaultIme) <> 0 then
ActivateKeyboardLayout(Screen.DefaultKbLayout, KLF_ACTIVATE);
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
SetmyIme('微软拼音输入法');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ResetmyIme('微软拼音输入法');
end;

另外:关于你的向某个窗口字符,只需向改窗口连续发WM_KeyPress消息即可.
 
dsp大哥,我想应该你给的是一个关于怎样激活指定或缺省的IME,
而我是想要把已激活的IME给关闭,感谢你的回答,尤其期待下一次
,能解决以上两个问题。
我想说明的是,输入法在所有能接受文本输入的窗口都可以使用,
那我所设计的方法是用我的程序去替代WIN95的标准输入法,所以,
窗口的HANDLE是很难确定的。这样,又怎样向改窗口连续发
WM_KeyPress消息?
 
dsp,很不好意思,我因在未调试这个程序时已根据
所查阅的资料及以前的经验就推断了以上的结论,
事实上我发现ActivateKeyboardLayout(Screen.DefaultKbLayout, KLF_ACTIVATE);
同样能在打开输入法后将其关闭,是什么原因?
而且在WIN32函数参考中认为
对fuFlags参数如果装载的布局少于三个,则此标志的值是无关的。
希望各位对第二问不吝赐教!!!
 
对您的问题再说几句,也不只是不是沾边?

本线程的焦点窗口可由GetActiveWindow来获得.
否则,只好用Win32新增的GetForegroundWindow.
有了窗口的句柄,其他的是否解决了呢?

当然,用Hook截获WM_KeyDown类的消息更彻底.
 
我因为要判断指定的WIN95标准输入法是否激活,如激活就
把它关闭,但用screen.defaultime的返回值为空,不知有何
好办法?
用HOOK我已能够获得当前输入对象的句柄,但具体消息如何能
正确的将中文发送到输入对象的窗口?
再次感谢DSP回答!!!
 
钱先生有一个CEdit的样例程序专门示范用户化IME, 可以到Delphi 32 深度历险
去档过来(BIG5); 如有困难我可以又给你一个国标化的CEDIT
 
CEditGB.Zip has been send out
 
CEditGB.Zip已收到,现在我发现在WH_CALLWNDPROC类型的HOOK中
使用DSP老兄的方法来关闭已打开的输入法会出现一个异常错误
从而使得NOTEPAD之类的程序关闭,不知对此是否有什么好办法?

我因使用自己的输入法程序,所以必须把已打开的输入法关闭。

请各位大侠快出手相助!!!
 
CEditGB.Zip文件因网络速度太慢,每次下载不完;
还请huizhang能否将文件分小为5K的多文件再寄
一次,感激不尽!!!!!
 
CEditGN才36k, 不至于下不来吧?

CEdit has demonstrated how to handle IME.
 
我找到这样一个方法来关闭IME输入法较简单:

imehandle:=ImmGetDefaultIMEWnd(hwnd);
PostMessage(imehandle,WM_DESTROY,wp,lp);

但我还是没办法获得当前IME的信息(名称或对应的文件)?

另外,因校园网太慢,的确下载有问题。

仍然征求送字的解答?
 
多人接受答案了。
 
顶部