【发布时间】:2012-02-19 10:08:35
【问题描述】:
我用 c# Windows Forms 做了一个屏幕键盘。我使用Sendkeys.Send() 函数发送击键。除了字母 i 之外的所有字母都可以正常工作。当我在 Microsoft Word 打开时按键盘上的字母 i 时,它会发送 Ctrl + Alt + I并打开打印对话框。 Notepad++ 也一样。但是当我尝试在记事本中输入时它工作正常。
在我的代码中,我发送带有SendKeys.Send(value); 的键,其中值是按下的按钮的文本。我得到带有以下代码的文本:
string s = ((Button)sender).Text;
关于为什么它不能正常工作的任何 cmets?
编辑:我用一个按钮创建了一个新的 Windows 窗体项目,整个代码如下。还是行不通。任何想法将不胜感激。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
SendKeys.Send("i");
}
// Prevent form being focused
const int WS_EX_NOACTIVATE = 0x8000000;
protected override CreateParams CreateParams
{
get
{
CreateParams ret = base.CreateParams;
ret.ExStyle |= WS_EX_NOACTIVATE;
return ret;
}
}
}
重写的功能是防止表单被聚焦。这样我就可以将击键发送到具有焦点的其他应用程序。
【问题讨论】:
-
肯定在这部分代码吗?
value是什么,这不是关键字吗?在某些情况下,您可能会发现使用(object as MyClass)进行转换而不是使用((MyClass)object)进行转换。如果 obj 不是 MyClass,第二个将返回 null,而不是抛出类转换异常。 -
对不起。它将是字符串 s 而不是值 s。即使我这样做,结果也不会改变:Sendkeys.Send("i");
-
您是否使用调试器检查
s的值?这将帮助您缩小问题范围。 -
是的,在调试器的Sendkeys函数中字符串的值为“i”。我创建了一个按钮并在 onclick 事件中添加了 Sendkeys.Sends("i") 但结果没有改变。
-
@DaveFerguson 我意识到问题是因为我有土耳其语操作系统。如果我将语言更改为英语,该代码运行良好。但在土耳其语中不起作用。现在首先我检测当前应用程序的界面语言并根据语言发送密钥。当界面是英文时,我用 Sendkeys.Send("+{I}") 来做。如果有人需要,我可以发送详细的答案。感谢所有的答案...
标签: c# winforms pinvoke sendkeys