单击按钮,将单击Key

时间:2013-06-08 13:41:49

标签: c# winforms

在C#中,我希望点击一个按钮。我不想使用button.click + =这样的按钮事件...我想点击表格应用程序中的按钮,我的计算机的任何键都会被点击。我试过SendKeys,但效果不好。

我需要更多的想法如何做到这一点。我试过了:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication1
{
public partial class Form5 : Form
{
    Button[,] b;
    List<char> chrlist = new List<char>();
    public Form5()
    {
        InitializeComponent();
        start();
    }

    public void start()
    {
        panel1.Controls.Clear();
        int m = 13;
        int n = 2;
        b = new Button[n, m];
        int x = 0;
        int i, j;
        int y = 0;
        // int count = 0;
        int chr1=(int)'A';
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < m; j++)
            {
                //  count++;
                b[i, j] = new Button();
                b[i, j].SetBounds(x, y, panel1.Size.Width / m, panel1.Size.Height / n);
                b[i, j].Name = i + "," + j;
                b[i, j].Text = ((char)chr1).ToString();
                   b[i, j].Click += new EventHandler(ButtonClick);
                panel1.Controls.Add(b[i, j]);
                x = x + panel1.Size.Width / m;
                chr1++;
            }
            y = y + panel1.Size.Height / n;
            x = 0;
        }
    }

    public void ButtonClick(Object sender, EventArgs e)
    {
        Button a = (Button)sender;
        MessageBox.Show(a.Text);

    }
    public void started()
    {
        while (true)
        {
            int sec = 1000;
            Thread.Sleep(sec * 3);
            SendKeys.SendWait("{TAB}");
        }

    }


    private void button1_Click(object sender, EventArgs e)
    {
        Thread workerThread = new Thread(started);
        workerThread.Start();

    }
}

}

这在我的其他应用程序中无效。

1 个答案:

答案 0 :(得分:3)

在我看来,您正在尝试构建一个屏幕键盘

前提:使用SendKeys向活动应用程序发送信件。

问题:当您单击表单中的按钮发送信件时,哪个应用程序有焦点?

回答:你的。因此,密钥将被发送到您的应用程序,而不是最后关注的应用程序。

解决方案:阻止您的应用程序获得专注。

这可以通过CreateParams()

在扩展窗口样式中设置WS_EX_NOACTIVATE标志来实现。
    private const int WS_EX_NOACTIVATE = 0x08000000;

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

    public void ButtonClick(Object sender, EventArgs e)
    {
        SendKeys.Send(((Control)sender).Text);
    }

现在,当您单击OSK中的按钮时,当前关注的应用程序将以STAY为焦点(因为您的应用程序无法获得焦点),而SendKeys()将正确定位它。

*警告:仅当屏幕键盘是其他应用程序时才有效。换句话说,OSK无法在您自己的应用程序中定位其他表单......这是一个奇怪的焦点。要定位您自己的应用,您必须手动跟踪应用中的最后一个表单,并在发送密钥之前再次关注它。

这是您的OSK向记事本发送密钥: Onscreen Keyboard Example

这是我测试应用中代码的全部

public partial class Form1 : Form
{
    private Button[,] b;

    private const int WS_EX_NOACTIVATE = 0x08000000;

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

    public Form1()
    {
        InitializeComponent();
        start();
    }

    public void start()
    {
        panel1.Controls.Clear();
        int m = 13;
        int n = 2;
        b = new Button[n, m];
        int x = 0;
        int i, j;
        int y = 0;
        // int count = 0;
        int chr1 = (int)'A';
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < m; j++)
            {
                //  count++;
                b[i, j] = new Button();
                b[i, j].SetBounds(x, y, panel1.Size.Width / m, panel1.Size.Height / n);
                b[i, j].Name = i + "," + j;
                b[i, j].Text = ((char)chr1).ToString();
                b[i, j].Click += new EventHandler(ButtonClick);
                panel1.Controls.Add(b[i, j]);
                x = x + panel1.Size.Width / m;
                chr1++;
            }
            y = y + panel1.Size.Height / n;
            x = 0;
        }
    }

    public void ButtonClick(Object sender, EventArgs e)
    {
        SendKeys.Send(((Control)sender).Text);
    }

}