【问题标题】:How to simulate a Ctrl A + Ctrl C using keybd_event如何使用 keybd_event 模拟 Ctrl A + Ctrl C
【发布时间】:2013-01-01 22:53:51
【问题描述】:

如何使用keybd_event模拟Ctrl-A + Ctrl-C

因为我在 webbrowser 表单上模拟 ctrl a + ctrl c 来复制剪贴板上的全部内容。我使用了 SendKeys.SendWait 但它没有复制全部内容!

【问题讨论】:

  • 实际上想要做什么?
  • 我在 webbrowser 表单上模拟 ctrl a + ctrl c 来复制剪贴板上的全部内容。我使用了这个 SendKeys.SendWait(^a^c) 但它没有复制整个内容!
  • 如果您“拥有”网络浏览器表单,您难道没有将该值存储在某个属性/字段中吗?你能举一个你想做什么的确切例子吗?这将为您的问题提供更好的答案。
  • 你的意思是我应该通过文档属性来探索?好的,我在该 webbrowseform 中显示带有结果和其他内容的集体实验室订单详细信息。我为用户提供 2 个按钮。一种是“复制”,单击它会将整个内容复制到剪贴板。另一种是Copy Selected,即使用鼠标光标将选定的内容或文本复制到剪贴板。

标签: c# keyboard-events


【解决方案1】:

这应该可以工作

[DllImport("user32.dll", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

public const int KEYEVENTF_KEYDOWN = 0x0000; // New definition
public const int KEYEVENTF_EXTENDEDKEY = 0x0001; //Key down flag
public const int KEYEVENTF_KEYUP = 0x0002; //Key up flag
public const int VK_LCONTROL = 0xA2; //Left Control key code
public const int A = 0x41; //A key code
public const int C = 0x43; //C key code

public static void PressKeys()
{
    // Hold Control down and press A
    keybd_event(VK_LCONTROL, 0, KEYEVENTF_KEYDOWN, 0);
    keybd_event(A, 0, KEYEVENTF_KEYDOWN, 0);
    keybd_event(A, 0, KEYEVENTF_KEYUP, 0);
    keybd_event(VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0);

    // Hold Control down and press C
    keybd_event(VK_LCONTROL, 0, KEYEVENTF_KEYDOWN, 0);
    keybd_event(C, 0, KEYEVENTF_KEYDOWN, 0);
    keybd_event(C, 0, KEYEVENTF_KEYUP, 0);
    keybd_event(VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0);
}

【讨论】:

  • 嗨,巴厘岛,非常感谢您的帖子。我想在任何其他情况下这都会奏效。但在我的情况下,浏览器控件只考虑 html 的第一个逻辑“分组”......也许它击中了下一个“锚点”,这导致它不能复制所有......!!!必须深入研究..非常感谢!当我得到解决方案时,我会更新这篇文章......
  • 请注意,KEYEVENTF_EXTENDEDKEY 不是按键。按键没有定义。使用 0(或自己定义)。
  • keybd_event(C, 0, 0, 0); keybd_event(C, 0, 2, 0); 为我工作。
【解决方案2】:

你可以触发 Cntrl-A + Cntrl-C 事件,对吗?但是由于某种原因,您没有将所有网页文本复制到剪贴板?

我对进行 Cntrl-A + Cntrl-C 事件知之甚少,我也不清楚你想做什么,但我尽了最大努力,想出了一些能抓住的东西网页中的所有文本,并通过按钮单击事件将其复制到剪贴板......(现在显然你想使用你的 Cntrl-A + Cntrl-C)。同样出于调试目的,我将剪贴板文本放在 .txt 文件中,以便您仔细检查。

我也在使用 HTML Agility Pack。你可以从http://htmlagilitypack.codeplex.com/得到那个

代码

    private void btnClip_Click(object sender, EventArgs e)
    {
        string address = "http://animalrights.about.com/";
        string text = "";

        // Retrieve resource as a stream
        Stream data = client.OpenRead(new Uri(address)); //client here is a WebClient

        //create document
        HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument();
        document.Load(data);

        //receive all the text fields
        foreach (HtmlNode node in document.DocumentNode.SelectNodes("//child::p"))
        {
            text += node.InnerText + "\n\n";
        }

        Clipboard.SetText(text);
        string path = @"C:\Users\David\Documents\Visual Studio 2012\Projects\CopyToClipBoard\CopyToClipBoard\bin\MyTest.txt";

        // Delete the file if it exists.
        if (File.Exists(path))
        {
            File.Delete(path);
        }

        // Create the file.
        using (FileStream fs = File.Create(path, 1024))
        {
            Byte[] info = new UTF8Encoding(true).GetBytes(text);

            // Add some information to the file.
            fs.Write(info, 0, info.Length);
        }

        //destroy data object
        data.Close();
        data.Dispose();
    }

打开记事本查看文件

【讨论】:

    【解决方案3】:

    Windows 输入模拟器让这变得超级简单。

    Windows 输入模拟器提供了一个简单的 .NET (C#) 接口 使用 Win32 SendInput 方法模拟键盘或鼠标输入。全部 为您完成了互操作,并且有一个简单的编程模型 用于发送多次击键。

    Nuget 包 -> 安装包 InputSimulator

    https://inputsimulator.codeplex.com/

    【讨论】: