如何模拟CTRL+;C中的C#
我有下面的代码,它在记事本中运行良好,但在WORD中无法运行如何模拟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
[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。