移动输入法窗体(200分)

  • 主题发起人 主题发起人 delphidragon
  • 开始时间 开始时间
哈哈,托动move到。。上面,注意没有出错出来
 
不要半路松鼠标,否则,一 
 
移动的就不是输入法了
 
那个move不是按钮,是让你托动的
 
确认问题:
如何在调出中文输入法时自动将其窗体(3个)内容复制和显示到自己程序的指定位置,
并不影响输入法输入。当然,最好能同时屏蔽掉原输入法窗体。
 
1)一个Edit,其IMEName:='智能ABC';3个Label;
2)Edit被选中后触发或GetKeyboardLayOut触发;
3)每出现一个输入法窗口或窗口改变则相应刷新3个Label;
4)输入法变为英文或Edit失去焦点时停止并清空3个Label;
5)最好屏蔽3个输入法窗体(令其大小为0或1;movewindow(hwd,0,0,0,0,true))
 
还没解决?
 
我已经尽力了,只是觉得这样作好象不太现实
 
小黄鱼在线吗
 
var
item :Tlistitem;
findhandle,phandle,temp :Thandle;
//类名
s_classname:array [0..255]of char;
//窗口名
cap :array [0..255]of char;
data :^Thandle;


得到句柄

findhandle :=windowfrompoint(mouse.CursorPos);

得到窗口名
getwindowtext(findhandle,cap,255);
得到类名
getclassname(findhandle,s_classname,255);
 
小黄鱼:
用鼠标找到的类名ImeStatusPHON用findwindow('ImeStatusPHON',nil)得不到句柄。
 
昨天我给你的类名,你不就可以找到么
 
昨天是XP专用窗口的窗口名可用
 
 Borland Delphi 以 其 强 大 的 功 能 及 和 高 效 的 可 视 化 开 发 环 境 为 广 大 程 序 设 计 员 所 青 睐 。 尤 其 是 它 封 装 了WINDOWS API 函 数, 能 方 便 地 利 用WINDOWS 资 源, 大 大 加 快 了 程 序 开 发 速 度。

  在 平 时 的 计 算 机 操 作 中, 中 文 输 入 是 不 可 避 免 的。 使 用 者 可 能 喜 欢 不 同 的 中 文 输 入 法(inputmethod editor, 简 称IME), 这 就 不 得 不 经 常 点 击 任 务 栏 中 的 中 文 图 标 或 用CTRL+Space,CTRL+Shift 热 键 切 换, 初 学 者 用 起 来 很 不 方 便。 针 对 这 一 问 题, 可 以 在 开 发 软 件 时, 在 程 序 中 设 置 用 户 喜 欢 的 中 文 输 入 法, 方 便 用 户 的 使 用。Delphi 中 只 有 少 数 控 件 如TEdit 支 持IME, 而 且 该 功 能 不 强, 不 能 在 运 行 时 更 改 输 入 法。

  笔 者 通 过 实 践 和 摸 索, 查 找 了 相 关 的IME 资 料, 利 用 了WINDOWS API 函 数, 实 现 了IME 的 功 能。

常 用 函 数 有:

API函数:BOOL ImmSimulateHotKey

(HWND hWnd,DWORD dwHotKeyID);//模拟热键

其中Hwnd为程序窗口的句柄,dwHotHKeyID

为模拟的热键,若成功则返回True

HKL GetKeyboardLayout(DWORD dwLayout);

//获得当前键盘状态

BOOL ImmIsIME(HKL hKL);

//判断当前是否处于中文输入状态,若是则返回True

自定义函数:

打开相应输入法:OpenIme(imename:string),

例OpenIme('全拼输入法');

关闭中文输入法:CloseIme;

 

以下是一个简单的例子,仅起参考作用。

使用时uses中加上imm

具体的实现方法及源代码如下:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes,

Graphics, Controls, Forms, Dialogs,

StdCtrls, Buttons,imm;

type

TForm1 = class(TForm)

ComboBox1: TComboBox;

BitBtn1: TBitBtn;

BitBtn2: TBitBtn;

BitBtn3: TBitBtn;

procedure FormShow(Sender: TObject);

procedure OpenIme(imename:string);

procedure closeIme;

procedure ComboBox1Change(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

procedure BitBtn2Click(Sender: TObject);

procedure BitBtn3Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormShow(Sender: TObject);

var

j:integer;

begin

for j:=0 to screen.imes.count-1 do

begin

ComBoBox1.Items.Add(screen.Imes.strings[j]);

//获取系统中已安装的中文输入法

end;

end;

procedure Tform1.OpenIme(imename:string);

var

I:integer;

myhkl:hkl;

begin

if ImeName<>'' then

begin

if Screen.Imes.Count<>0 then

begin

I:=screen.Imes.indexof(imename);

if I>=0 then

myhkl:=hkl(screen.Imes.objects);

activatekeyboardlayout(myhkl,

KLF_ACTIVATE);//设置相应的输入法

end;

end;

end;

procedure TForm1.closeime;

var

myhkl:hkl;

begin

myhkl:=GetKeyBoardLayOut(0);

if ImmIsIME(myhkl) then

//判断是否在中文状态,若是则关闭它

immsimulateHotkey(handle,

IME_CHotKey_IME_NonIME_Toggle);

end;

procedure TForm1.ComboBox1Change(Sender: TObject);

begin

OpenIme(ComboBox1.Text);

end;

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

immsimulateHotkey(handle,

IME_CHotKey_shape_Toggle);//切换半角和全角模式

end;

procedure TForm1.BitBtn2Click(Sender: TObject);

begin

immsimulateHotkey(handle,

IME_CHotKey_symbol_Toggle);

//切换中文标点模式和英文标点模式

end;

procedure TForm1.BitBtn3Click(Sender: TObject);

begin

closeime;

end;

end.

---- 本 程 序 在Delphi 3.0/4.0 下 通 过。

 
以上例子中,可以得到句柄(返回值)
handle = activatekeyboardlayout(myhkl,

KLF_ACTIVATE);//设置相应的输入法
 
这也是最好的方法了
你试试吧
我都搞了一夜了
 
如果要资料的话,我可以给你一些,中文api解释,关于输入法的
 
小黄鱼:
你Imm32.pas理解得真好!一看就是玩API的。
我晚上和你联系,findwindow('ImeStatusPHON',nil)再给看看。
 
问题我已自己解决,
还是老办法:spy找到类名,movewindow(findwindow()) API
 
后退
顶部