在不同的应用程序中复制和修改选定的文本

Posted

技术标签:

【中文标题】在不同的应用程序中复制和修改选定的文本【英文标题】:Copy and Modify selected text in different application 【发布时间】:2010-09-19 03:44:25 【问题描述】:

我有一个在后端运行的 Windows 应用程序。我将此应用程序中的功能映射到热键。就像我在这个函数中放入一个消息框并将热键设置为 Alt+Ctrl+D。然后同时按下 AltCtrlD 会出现消息框。到目前为止,我的应用程序运行良好。

现在我想在这个函数中编写一个代码,这样当我使用另一个应用程序(如记事本)时,我选择一个特定的文本行并按下热键 Alt + Ctrl + D 它应该复制选定的文本,将其附加“_copied”并将其粘贴回记事本。

任何尝试过类似应用程序的人请帮助我提供宝贵的意见。

【问题讨论】:

【参考方案1】:

你的问题有两个答案

我的应用如何设置全局热键

您必须调用一个名为 RegisterHotKey 的 API 函数

BOOL RegisterHotKey(
    HWND hWnd,         // window to receive hot-key notification
    int id,            // identifier of hot key
    UINT fsModifiers,  // key-modifier flags
    UINT vk            // virtual-key code
);

更多信息在这里:http://www.codeproject.com/KB/system/nishhotkeys01.aspx

如何从前台窗口中获取选中的文本

最简单的方法是发送 crl-C 到窗口,然后捕获剪贴板内容。

[DllImport("User32.dll")] 
private static extern bool SetForegroundWindow(IntPtr hWnd);

[DllImport("user32.dll", CharSet=CharSet.Auto)]
static public extern IntPtr GetForegroundWindow();

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


.....

private void SendCtrlC(IntPtr hWnd)
    
    uint KEYEVENTF_KEYUP = 2;
    byte VK_CONTROL = 0x11;
    SetForegroundWindow(hWnd);
    keybd_event(VK_CONTROL,0,0,0);
    keybd_event (0x43, 0, 0, 0 ); //Send the C key (43 is "C")
    keybd_event (0x43, 0, KEYEVENTF_KEYUP, 0);
    keybd_event (VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);// 'Left Control Up


免责声明:Marcus Peters 的代码来自此处:http://bytes.com/forum/post1029553-5.html 为了您的方便,在此发布。

【讨论】:

如何使用 SendCtrlC ?我知道我传入了一个 IntPtr 但我的控件的什么属性提供了这个?【参考方案2】:

使用Clipboard 类将内容复制到剪贴板,然后粘贴到记事本中。

您还可以将内容写入文本文件,然后通过运行 notepad.exe 应用程序并将文本文件的路径作为命令行参数使用记事本打开它。

【讨论】:

感谢您的信息。我的主要问题是,应用程序是否有可能了解其他应用程序(如记事本)中的选定文本。请让我知道这是否可行?【参考方案3】:

2020 年更新

如何从前台窗口中获取选中的文本

不知道这可能持续了多长时间,而不是与 Win32 编程(主要是 user32.dll 和各种 Windows 消息,如 WM_GETTEXT, WM_COPY 和各种 SendMessage(handle, WM_GETTEXT, maxLength, sb) 调用)作斗争,这在大多数关于这个主题的 SO 线程中都是建议的, 我很容易在我的 C# 代码中的任何窗口中访问选定的文本

// programatically copy selected text into clipboard
await System.Threading.Tasks.Task.Factory.StartNew(fetchSelectionToClipboard);

// access clipboard which now contains selected text in foreground window (active application)
await System.Threading.Tasks.Task.Factory.StartNew(useClipBoardValue);

这里调用的方法:

static void fetchSelectionToClipboard()

  Thread.Sleep(400);
  SendKeys.SendWait("^c");   // magic line which copies selected text to clipboard
  Thread.Sleep(400);


// depends on the type of your app, you sometimes need to access clipboard from a Single Thread Appartment model..therefore I'm creating a new thread here
static void useClipBoardValue()

  Exception threadEx = null;
  // Single Thread Apartment model
  Thread staThread = new Thread(
     delegate ()
       
          try
          
             Console.WriteLine(Clipboard.GetText());
          
          catch (Exception ex)
          
            threadEx = ex;
          
      );
  staThread.SetApartmentState(ApartmentState.STA);
  staThread.Start();
  staThread.Join();

【讨论】:

【参考方案4】:

我认为您可以使用SendInput 函数将文本发送到目标窗口,或者如果您之前已将其放入剪贴板,则只需将其粘贴的命令。

【讨论】:

以上是关于在不同的应用程序中复制和修改选定的文本的主要内容,如果未能解决你的问题,请参考以下文章

如何在崇高文本中多次复制选定的文本或行?

如何在textarea中获取选定的文本? [复制]

使用 VBA 和 Adob​​e PDF Reader 控件复制选定的文本

将样式应用于选定文本未选定框

如何使用 PDFKit 突出显示 pdf 中的选定文本?

如何从 jquery 的文本区域中获取选定的文本? [复制]