zoukankan      html  css  js  c++  java
  • 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

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

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

  • 相关阅读:
    数据仓库经验小结(转)
    SSIS高级内容 系列一
    SSIS高级内容 系列二
    SSIS数据流组件开发(1)转载
    在sharepoint中添加视频播放
    处理数据仓库中历史数据的若干问题
    SSIS数据流组件开发(2) 转载
    [转载]俄罗斯只剩“大国的脾气”
    [转载]游击队员之歌
    [转载]世界是女人的
  • 原文地址:https://www.cnblogs.com/Interkey/p/2889735.html
Copyright © 2011-2022 走看看