Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何模拟CTRL+;C中的C#_C#_Richtextbox_Copy Paste - Fatal编程技术网

如何模拟CTRL+;C中的C#

如何模拟CTRL+;C中的C#,c#,richtextbox,copy-paste,C#,Richtextbox,Copy Paste,我有下面的代码,它在记事本中运行良好,但在WORD中无法运行 [DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); [DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll", SetLastError = true

我有下面的代码,它在记事本中运行良好,但在WORD中无法运行

 [DllImport("user32.dll")]
 public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

 [DllImport("user32.dll")]
 public static extern IntPtr GetForegroundWindow();

 [DllImport("user32.dll", SetLastError = true)]
 public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

 [DllImport("kernel32.dll")]
 public static extern uint GetCurrentThreadId();

 [DllImport("user32.dll")]
 public static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);

 [DllImport("user32.dll")]
 public static extern IntPtr GetFocus();

 [DllImport("user32.dll")]
 public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, StringBuilder lParam);

 // second overload of SendMessage
 [DllImport("user32.dll")]
 public static extern int SendMessage(IntPtr hWnd, uint Msg, out int wParam, out int lParam);

 [DllImport("user32.dll")]
 public static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

 public const uint WM_GETTEXT = 0x0D;
 public const uint WM_GETTEXTLENGTH = 0x0E;
 public const uint EM_GETSEL = 0xB0;

        IntPtr hWnd = WinUser.GetForegroundWindow();
        uint processId;
        uint activeThreadId = WinUser.GetWindowThreadProcessId(hWnd, out processId);
        uint currentThreadId = WinUser.GetCurrentThreadId();

        WinUser.AttachThreadInput(activeThreadId, currentThreadId, true);
        IntPtr focusedHandle = WinUser.GetFocus();
        WinUser.AttachThreadInput(activeThreadId, currentThreadId, false);

        int len = WinUser.SendMessage(focusedHandle, WinUser.WM_GETTEXTLENGTH, 0, null);
        StringBuilder sb = new StringBuilder(len);
        int numChars = WinUser.SendMessage(focusedHandle, WinUser.WM_GETTEXT, len + 1, sb);

        int start, next;
        string selectedText = "";
        WinUser.SendMessage(focusedHandle, WinUser.EM_GETSEL, out start, out next);
        try
        {
            selectedText = sb.ToString().Substring(start, next - start);
        }
不幸的是,当在Word或任何“richtextbox”中选择文本时,上面返回“{Microsoft Word Document}”。 CTRL+C是如何实现的


注意:这在记事本或任何简单的文本编辑器中都可以很好地使用。

我认为您应该在上查看本教程。在C#中使用复制粘贴实际上并不像你想象的那么难

复制

Clipboard.SetText(txtClipboard.Text);
粘贴

txtClipboard.Text = Clipboard.GetText();

有关更多信息和示例,请查看上述链接。您还应该查看for
剪贴板

我认为您应该在上查看本教程。在C#中使用复制粘贴实际上并不像你想象的那么难

复制

Clipboard.SetText(txtClipboard.Text);
粘贴

txtClipboard.Text = Clipboard.GetText();

有关更多信息和示例,请查看上述链接。您还应该查看for
剪贴板

您要查找的是:

您要找的是:

我很确定Word不会对
EM.
消息做出响应。这些消息特定于Windows编辑控件;碰巧记事本的文本使用了一个简单的编辑控件

您可以使用Word COM自动化接口实现您想要的功能。没有100%保证从另一个应用程序检索文本的方法


编辑:我不是这方面的专家,但您可能会在可访问性API方面取得更大的成功。应用程序(如记事本或Word)可能会公开一组表示其用户界面的对象,您可以从应用程序中查询这些对象。

我很确定Word不会响应
EM
消息。这些消息特定于Windows编辑控件;碰巧记事本的文本使用了一个简单的编辑控件

您可以使用Word COM自动化接口实现您想要的功能。没有100%保证从另一个应用程序检索文本的方法



编辑:我不是这方面的专家,但您可能会在可访问性API方面取得更大的成功。应用程序(如记事本或Word)可能会公开一组表示其用户界面的对象,您可以从应用程序中查询这些对象。

您想模拟按键还是复制数据?不,我只想从另一个窗口复制数据。不使用CTRL+C,而是执行上面的操作。我不敢相信有人否决了这个问题,并且有超过1K个视图!!。。我想模拟“Ctrl-C”的按键,有没有一种方法可以在C#中实现?你想模拟按键还是复制数据?没有,我只想从另一个窗口复制数据。不使用CTRL+C,而是执行上面的操作。我不敢相信有人否决了这个问题,并且有超过1K个视图!!。。我希望模拟“Ctrl-C”的按键,有没有一种方法可以在C#中实现这一点?使用剪贴板很简单,但我希望不使用Ctrl+C复制文本,我正在尝试模拟它,而不是使用它。因此剪贴板将是空的。priyank的评论有助于在该链接中,他们发送一条消息来模拟ctrc+c,然后我可以使用剪贴板对象,就像u建议的那样。。Thankspiyanks的评论效果很好,但我完全忘记了这样做的主要目的不是将数据保存在windows剪贴板中。这就是我需要模拟Ctrl+c而不使用它的原因。:)你知道我在上面的代码中哪里出错了吗?这正是我想知道的??你使用剪贴板很容易,但我希望不使用CTRL+C复制文本,我试图模拟它-而不是使用它。因此剪贴板将是空的。priyank的评论有助于在该链接中,他们发送一条消息来模拟ctrc+c,然后我可以使用剪贴板对象,就像u建议的那样。。Thankspiyanks的评论效果很好,但我完全忘记了这样做的主要目的不是将数据保存在windows剪贴板中。这就是我需要模拟Ctrl+c而不使用它的原因。:)你知道我在上面的代码中哪里出错了吗?这正是我想知道的??这可能是!谢谢,让我看看。事实上,我从那个网站上获得了基本代码。嗨,这很好,但我完全忘记了这样做的主要目的不是将数据保存在windows剪贴板中。这就是我需要模拟Ctrl+c而不使用它的原因。:)复制剪贴板内容,再次模拟Ctrl+c读取,并还原原始内容。这可能是错误的!谢谢,让我看看。事实上,我从那个网站上获得了基本代码。嗨,这很好,但我完全忘记了这样做的主要目的不是将数据保存在windows剪贴板中。这就是我需要模拟Ctrl+c而不使用它的原因。:)复制剪贴板内容,再次模拟Ctrl+c读取,然后还原原始内容。我正在尝试以下操作:从活动窗口复制已选择的文本。然后解析该文本以在我的服务中执行某些操作。是的,你是对的,这在任何普通编辑控件上都能很好地工作。好的,要么使用Word automation API,要么使用更通用的辅助功能API。下面是我正在尝试的:从活动窗口中,我需要复制所选的文本。然后解析该文本以在我的服务中执行某些操作。是的,你是对的,这在任何普通的编辑控件上都能很好地工作。好的,要么使用Word自动化API,要么使用更通用的可访问性API。