.NET使用sendkeys向计算器发送命令

4
以下的sendkeys代码在记事本中运行良好,但在计算器中无法工作。问题出在哪里?(与我在这里发送的问题.NET程序的Sendkeys问题相比,这是另一个问题)
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName,string lpWindowName);
[DllImport("User32")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
private void button1_Click(object sender, EventArgs e)
{
    IntPtr calculatorHandle = FindWindow("SciCalc", "Calculator");
    //IntPtr calculatorHandle = FindWindow("Notepad", "Untitled - Notepad");
    if (calculatorHandle == IntPtr.Zero)
    {
        MessageBox.Show("Calculator is not running.");
        return;
    }
    SetForegroundWindow(calculatorHandle);
    System.Threading.Thread.Sleep(1000);
    SendKeys.SendWait("111*11=");
    //SendKeys.SendWait("{ENTER}");
    //cnt++;
    SendKeys.Flush();
}
3个回答

8
我会告诉你如何找出如何将按键发送到calc.exe。使用Spy ++监视您使用它时calc.exe窗口进程上的消息。要做到这一点,请进入Spy ++并单击日志消息工具栏按钮。将光标拖到calc.exe窗口上。我给出的说明适用于VS2008,其他VS版本中包含的Spy ++可能略有不同。但是,始终可用相同的功能。

您将看到在输入文本时发送的确切消息。您需要执行相同的操作。

使用Win32 API SendMessage,LPARAM和WPARAM发送到您找到的窗口句柄。


我赞同使用SendMessage而不是SendKeys。您可以在此处找到相关信息:http://msdn.microsoft.com/en-us/library/ms646280 - Morten Mertner
SendKeys只是SendMessage的包装器吗? - Adam
@Adam:可能是这样,但不确定。我猜我的建议是,除了按键之外,也许你需要执行其他命令。但无论如何,你可以通过观察信息来弄清楚它是什么。 - Brian R. Bondy
对于通过谷歌找到这个帖子的任何人,我在这里也有一个相关的帖子:https://dev59.com/cHA75IYBdhLWcg3w49YR#3047387 - Brian R. Bondy

0

我想我找到问题所在了。时序是问题所在。只要我在发送命令之间加上sleep()函数,calc.exe就能正确执行。但这不是一个好的解决方案。


@user203123:你把sleep放在哪里了? - Brian R. Bondy
你发布的代码(由于我使用Win7,不得不将“SciCalc”更改为“CalcFrame”)对我来说运行良好。输出是“1221”。 - Adam

0
在Windows 7上,您需要执行以下操作:
IntPtr calculatorHandle = FindWindow("CalcFrame", "Calculator");

但根据您刚才发布的内容,我猜测您的问题不在于获取窗口句柄。 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接