想用Delphi做一个输入法切换的程序

yuwenfeng 2010-05-24 02:06:55
现在想用delphi做一个按一个键就可以更换系统的输入法,如在开了多个word或txt文本,按F8可以自动实现输入法的切换。也就是说按F8=按了ctrl+shift,
网上查了一些资料,keybd_event API和PostMessage 因为是要全部都可以设置,所以keybd_event 好像不是很适用,用postmessage 也测试过,返回也为true,但就是切换不了输入法。。

下面为源码:
请高手看看
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,shellapi, StdCtrls;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
//procedure KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
procedure WMHotKey(var msg:tmessage); message WM_HOTKEY;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
var
HotKeyId: Integer; //热键
handle:Thandle;
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
//注册热键
self.Height :=1;
self.Width :=1;
HotKeyId := GlobalAddAtom('rspsoft');
RegisterHotKey(Handle,HotKeyId,0,VK_F5);
end;


procedure TForm1.WMHotKey(var msg:tmessage);
var keyno :char;
s:boolean;
begin
if (Msg.LParamHi = Vk_F5) and (Msg.LParamLo = 0) then
begin
// showmessage('F5');
s:=PostMessage(FindWindow(nil,nil),WM_SYSKEYDOWN,VK_CONTROL+VK_SHIFT,0) ; //其他的都是ok的,就这一段代码有问题. // showmessage(booltostr(s));
end;
end;


procedure TForm1.FormDestroy(Sender: TObject);
var
i: Integer;
begin
//注销热键
UnRegisterHotKey(handle,HotKeyId);
GlobalDeleteAtom(HotKeyId);
end;



end.
...全文
222 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hankcs 2010-05-27
  • 打赏
  • 举报
回复
FindWindow(nil,nil)
不对吧,你传两个NULL进去是什么意思?看看FindWindow原型
FindWindow(
lpClassName, {窗口的类名}
lpWindowName: PChar {窗口的标题}
): HWND; {返回窗口的句柄; 失败返回 0}
第一个参数传nil没问题,第二个得传什么'计算器''记事本'之类的呀
gyk120 2010-05-24
  • 打赏
  • 举报
回复
输入法切换会产生一个消息WM_INPUTLANGCHANGE

1,183

社区成员

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

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