2010-05-08 79 views
3

我想使用虚拟键盘组装在这里找到http://www.codeproject.com/KB/miscctrl/touchscreenkeyboard.aspx像在Windows中的屏幕键盘(OSK.exe)。有人可以告诉我如何使用它,以便它始终保持在最佳状态,但用户可以在键盘输入上选择其他窗口作为键盘输入,就像Windows中的“屏幕键盘”一样,具体我不知道如何选择最后选择的窗口(不能仅使用GetForegroundWindow或GetFocus,因为当用户点击虚拟键盘时,它会变得焦点,我得到键盘窗口本身的句柄)? 这对我来说非常紧迫,所以任何建议将不胜感激。C# - 发送键盘事件到(上一个)选择的窗口

在此先感谢。

回答

4

你需要做的是使你的窗口,它不能被激活。这很容易通过重写CreataParams来完成。然后,您可以使用SendKey.Send将按键发送到当前活动窗口,您的窗口永远不会变为活动状态。

下面是一个简单的例子,你会发现

public partial class Form1 : Form 
    { 
    const int WS_EX_NOACTIVATE = 0x08000000; 

    public Form1() 
    {  
     InitializeComponent();  
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
     CreateParams param = base.CreateParams; 
     param.ExStyle |= WS_EX_NOACTIVATE; 
     return param; 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     SendKeys.Send("A"); 
    } 
    } 

一个奇怪的是,因为你的窗口永远不会被激活,当你拖动窗口它不反应,而斯特朗。基本上拖动的作品,它只是不会在拖动过程中给视觉反馈。你可以通过覆盖WndProc和处理WM_NCLBUTTONDOWN和WM_MOUSEMOVE消息来解决这个问题。

+0

非常感谢Chris!你说得对,这是我需要的代码。在此之前,我在我所谓的“设计”中发现我错过了非常重要的事情,我不需要仅仅是活动的窗口句柄,而是它的控制也是我关注的焦点,我记不得在网上找到如何做到这一点。这解决了完整的问题。在应用程序代码后,您在第一个程序窗口中写入的代码不会像应该那样保持顶层,但随后删除了现在对“SetFocus()”和“SetForegroundWindow()”的不必要的调用,并且它像魅力一样工作。 是的,我注意到拖动时奇怪的窗口行为:) 再次感谢。干杯! – Maks 2010-05-09 04:38:45

+0

@Maks,我很高兴帮助。要将窗口置于顶部,可以将TopMost属性设置为true。 – 2010-05-09 16:02:48

+0

@Maks:如果你喜欢这个答案,你可以点击旁边的复选框将其标记为正确的答案。 :) – 2010-05-09 17:07:12

0

击键发送到另一个应用程序在C#
http://www.codeproject.com/KB/cs/SendKeys.aspx

然后,所有你需要的是一种方法来选择虚拟键盘的另一个窗口。要做到这一点,你只需要目标窗口的标题。

+0

感谢您的链接罗伯特,但我不知道用户可以选择的窗口的名称。尽管链接不错,但我发现了一些关于实际代码的说明,但不是解决方案。 – Maks 2010-05-09 04:29:02

1

当您获得输入焦点时,窗口消息WM_SETFOCUS被发送到您的窗口,并且.net将其转换为您收到的窗体事件。 windows消息包含前一个输入焦点窗口的句柄。

如果此信息在您的C#Form.Activated或Control.Enter/Control.GotFocus事件中不可用,那么您可能需要重写Form.WndProc以捕获原始Windows消息并检索句柄 - 您可以然后用于激活或发送WM_KEYDOWN消息到以前的输入焦点窗口。

+0

谢谢你努力回复Jason,但是尽管我现在在使用Win32 API之前做了很多工作,但我选择了更简单的方法。我注册了每秒触发的计时器,它会调用获取活动窗口句柄的方法并将其保存。可能不太干净,但现在我不能花更多时间重新访问原始API。 – Maks 2010-05-09 04:27:21

+0

没问题。这不是“优雅”,但它会工作,这往往是最重要的:-) – 2010-05-09 18:14:44