OK,刚看到这个博文,想起前段时间做的一个功能简单的小辅助程序【功能:实现一窗体始终置顶,但不占用焦点。对于需要多次重复输入的字符串,实现了鼠标点击即可在外部程序输入】。
然后就回想下思路留作曾经存在的痕迹(勿喷)。
最初代码和思路与上面博客内容所差无几;先发原来的代码:
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 }
主要实现窗体始终置前但不占用焦点,并向外部程序发送字符串!
在相应事件处理中添加:("some characters");
但有一点儿,也是实现这个小程序中遇到的最大的麻烦:SendKeys.Send()不能发送汉字,会被窗体输入法先行处理,无奈……
解决思路:起初,我是想通过控制输入法来实现:主要使用 ,但后来发现输入法为不同的窗口保存的是不同的设置,因此不能在一个程序里面设置另外一个程序的输入法状态(通过低层API可能实现),同时也找了很多其他API,都没法实现(或者我没找到);【很有可能通过 可以实现】(在一些地方提了下问题,呵呵,不过当再次看到回答的时候,博友给出思路的时候已经想到了,并且问题已经解决了……)
后来换了下思路,调用系统剪贴板实现:
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也可以,但这些都是模拟按键,是会被目标窗体的输入法处理的。
使用 找不到相应窗体句柄……
有点遗憾就是:在移动窗体位置的时候,没有留影子,主要是这个函数的结果:protected override CreateParams CreateParams ,但一直找不到解决方法……
本文地址:
内容很乱,仅做参考,可提意见,但勿喷~
学东西,要主学其思想,不能只学代码;代码是人家的,思想才是自己的。