C# 无法将键(字符串)发送到记事本

C# 无法将键(字符串)发送到记事本,c#,notepad,C#,Notepad,我认为代码很好,但事实并非如此。我正在尝试向我的记事本中添加一些文本,如下所示: 字符串文本=测试 当我尝试调试此函数时,会显示以下消息: 代码运行时不允许更改 如果这很重要,我会尝试从网页/应用程序编辑它。问题是,Visual Studio在到达断点时捕捉焦点,然后将SendKeys发送到Visual Studio而不是记事本,这会产生错误 您可以执行以下操作: 在断点上单击鼠标右键,然后选择“命中时…” 在那里,您可以输出任何您想要的内容,而不会使记事本失去焦点问题出在负责打开记事本的功能中

我认为代码很好,但事实并非如此。我正在尝试向我的记事本中添加一些文本,如下所示:

字符串文本=测试

当我尝试调试此函数时,会显示以下消息:

代码运行时不允许更改


如果这很重要,我会尝试从网页/应用程序编辑它。

问题是,Visual Studio在到达断点时捕捉焦点,然后将SendKeys发送到Visual Studio而不是记事本,这会产生错误

您可以执行以下操作:

在断点上单击鼠标右键,然后选择“命中时…”


在那里,您可以输出任何您想要的内容,而不会使记事本失去焦点

问题出在负责打开记事本的功能中,没有足够的时间启动并打开记事本。我刚刚添加了4s的等待函数。

对于我的,它是关于我使用源WinForms控件中的参考值文本,在源窗体尚未关闭或仍处于活动状态之前隐藏时调用SendKeys函数。这可能会产生类似的结果:SendKeys.Send或SendKeys.SendWait不会向目标应用程序发送所需的文本。 解决此问题的步骤如下: 一,。将文本值从活动窗体转移到新的临时变体或剪贴板, 二,。关闭或隐藏活动窗体, 三,。激活目标应用程序的表单, 四,。请稍等,以确保目标应用程序的窗体处于活动状态5。并将临时文本变体或剪贴板提供给SendKeys。作品
PS:请确保您的应用程序的运行时权限等于或大于目标应用程序。

该错误发生在调试时尝试编辑C代码时-只需在编辑器处于焦点时按键盘上的“a”就足够了。它与代码本身无关。。。小心你的手指:事实上,@Rob,那次编辑可能是在调试时SendKeys被发送到编辑器窗口的时候。这对我来说很有效,尽管p.Kill关闭了记事本,使整个练习变得多余。我从来没有玩过那种脚本,但我想知道调试+SetForeGroundInow是否不是问题所在。使用SetForeGroundIndow,您可以将记事本放在前面,但通过调试,您可以将IDE放在前面。因此,发送键可能被发送到IDE,而不是你的记事本…@MicroVirus啊,是的-你可能是对的。。这意味着以下情况之一:1。SetForeGroundIndowHandle;它不起作用了。2.SetForeGroundIndowHandle;正在工作,但VS立即再次或3集中注意力。SetForeGroundIndowHandle;在执行SendKeys.SendWait之前需要几个周期来处理
[DllImport("user32.dll")]
private static extern int SetForegroundWindow(IntPtr hWnd);

public void EditTxtFile(string text)
{
    Process p = Process.GetProcessesByName("notepad").FirstOrDefault();
    if (p != null)
    {
        IntPtr handle = p.MainWindowHandle;
        SetForegroundWindow(handle);
        SendKeys.SendWait(text);
        p.Kill(); //also process doesn't shoutdown
    }
}