C# 实现简单的键盘辅助功能及思路

OK,刚看到C#Winform实现简单的虚拟键盘这个博文,想起前段时间做的一个功能简单的小辅助程序【功能:实现一窗体始终置顶,但不占用焦点。对于需要多次重复输入的字符串,实现了鼠标点击即可在外部程序输入】。

然后就回想下思路留作曾经存在的痕迹(勿喷)。

最初代码和思路与上面博客内容所差无几;先发原来的代码:

 1         protected override CreateParams CreateParams  
 2         {
 3             get
 4             {
 5                 const int WS_EX_NOACTIVATE = 0x08000000;
 6 
 7                 CreateParams cp = base.CreateParams;
 8                 cp.ExStyle |= WS_EX_NOACTIVATE;
 9                 return cp;
10             }
11         }

主要实现窗体始终置前但不占用焦点,并向外部程序发送字符串!

在相应事件处理中添加:SendKeys.Send("some characters");

但有一点儿,也是实现这个小程序中遇到的最大的麻烦:SendKeys.Send()不能发送汉字,会被窗体输入法先行处理,无奈……

解决思路:起初,我是想通过控制输入法来实现:主要使用 InputLanguage.CurrentInputLanguage 属性,但后来发现输入法为不同的窗口保存的是不同的设置,因此不能在一个程序里面设置另外一个程序的输入法状态(通过低层API可能实现),同时也找了很多其他API,都没法实现(或者我没找到);【很有可能通过 SystemParametersInfo 可以实现】(在一些地方提了下问题,呵呵,不过当再次看到回答的时候,博友给出思路的时候已经想到了,并且问题已经解决了……)

后来换了下思路,调用系统剪贴板实现:

1 Clipboard.SetText(“some characters”);
2 
3 SendKeys.Send("^v");    //模拟Ctrl+V:

因为程序限制,所以不能保存原剪贴板内容,在其他地方使用时建议最好在设置剪贴板之前保存剪贴板内容:

1 IDataObject idata = Clipboard.GetDataObject();
2 
3 Clipboard.SetText(some characters);
4 SendKeys.Send("^v");
5 
6 Clipboard.SetDataObject(idata);

程序窗体是要向外部活动窗体来发送字符串,所以无法获取目标窗体句柄,就没法用SendMessage(),代替的是模拟按键SendKeys.Send()或SendKeys.SendWait(),当然,用keyboard_event也可以,但这些都是模拟按键,是会被目标窗体的输入法处理的。

使用 GetForegroundWindow 找不到相应窗体句柄……

有点遗憾就是:在移动窗体位置的时候,没有留影子,主要是这个函数的结果:protected override CreateParams CreateParams  ,但一直找不到解决方法……

 

本文地址:http://www.cnblogs.com/Interkey/archive/2013/02/02/2889735.html

 

内容很乱,仅做参考,可提意见,但勿喷~

 

学东西,要主学其思想,不能只学代码;代码是人家的,思想才是自己的。

 

你可能感兴趣的:(C#)