在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();
}
}
}
这在我的其他应用程序中无效。
答案 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向记事本发送密钥:
这是我测试应用中代码的全部:
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);
}
}