Sendkey或SendInput不从输入字段复制

时间:2016-03-15 14:07:29

标签: c# hotkeys sendkeys sendinput

我编写了一个小型控制台应用程序,用于复制Web应用程序中的高亮文本。 我试图以两种方式做到这一点

1)通过简单的Sendkeys

SendKeys.SendWait("^C");
 Application.DoEvents();

2)通过SendInput

Keyboard.SimulateKeyStroke('c', ctrl: true);

    public static void SimulateKeyStroke(char key, bool ctrl = false, bool alt = false, bool shift = false)
                    {
                        List<ushort> keys = new List<ushort>();

                        if (ctrl)
                            keys.Add(VK_CONTROL);

                        if (alt)
                            keys.Add(VK_MENU);

                        if (shift)
                            keys.Add(VK_SHIFT);

                        keys.Add(char.ToUpper(key));

                        INPUT input = new INPUT();
                        input.type = INPUT_KEYBOARD;
                        int inputSize = Marshal.SizeOf(input);

                        for (int i = 0; i < keys.Count; ++i)
                        {
                            input.mkhi.ki.wVk = keys[i];

                            bool isKeyDown = (GetAsyncKeyState(keys[i]) & 0x10000) != 0;

                            if (!isKeyDown)
                                SendInput(1, ref input, inputSize);
                        }

                        input.mkhi.ki.dwFlags = KEYEVENTF_KEYUP;
                        for (int i = keys.Count - 1; i >= 0; --i)
                        {
                            input.mkhi.ki.wVk = keys[i];
                            SendInput(1, ref input, inputSize);
                        }
                    }

我突出显示Chrome中的 Web应用程序上的文字,并通过ShortKey运行我的控制台应用程序。

当我突出显示标签字段时,

可行(从两个方面)。

当我突出显示任何输入字段时,

但是它不起作用(方法1或方法2都没有)。

enter image description here

对于前。我的网络应用程序有标签联系人2(上图),接下来是输入字段。当我突出Lable即Contact2(通过双击)并运行我的控制台应用程序(通过按shorkey)时,我会得到突出显示的文本,但是当我为输入字段执行相同操作时,我什么也得不到。

为什么 Chrome 正在接受标签复制通讯,而不接受输入

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我有一个启用了计时器的示例应用程序。在计时器事件中,有以下代码:

  private void timer1_Tick_1(object sender, EventArgs e)
  {
      SendKeys.SendWait("^c");
      Application.DoEvents();

      if (Clipboard.ContainsText())
      {
          var lText = Clipboard.GetText();
          textBox1.AppendText(lText);
      }
  }

请注意使用小“c”而不是大写“C”,因为Control + Shift + C将触发Chrome中的Developer工具。

这确实可以在Chrome网站的输入字段中成功打印所选文字。

如果这对您不起作用,我会看到两种可能性:

  1. 您尝试从密码字段中获取文本。这不起作用。
  2. 您将焦点放在另一个应用程序(您自己的应用程序)上以触发您的代码,因此输入字段不是在您的代码执行时具有焦点的控件。
  3. 如果这确实有效,但您的方法没有,那么触发代码的机制(使用某种形式的全局键盘快捷键)不起作用。也许是因为你使用的键盘快捷键已经被输入字段解释了。