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
内容很乱,仅做参考,可提意见,但勿喷~
学东西,要主学其思想,不能只学代码;代码是人家的,思想才是自己的。
作者:Cosmic_Spy
出处:http://www.cnblogs.com/Interkey/
有兴趣可以加群【.NET破解|反编译】请注明:博客园,谢谢~
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则肯定是你抄我的。
posted on 2013-02-02 02:53 Cosmic_Spy 阅读(2386) 评论(0) 编辑 收藏 举报