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

时间:2008-10-25 05:53:35

标签: c# .net clipboard hotkeys

我在后端运行了一个Windows应用程序。我将此应用程序中的函数映射到热键。就像我将一个消息框放入此函数并将热键提供为 Alt + Ctrl + D 。然后按 Alt Ctrl D 一起出现消息框。我的申请工作正常,直到这一点。

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

任何尝试过类似申请的人都可以帮助我提供宝贵的意见。

4 个答案:

答案 0 :(得分:13)

你的问题有两个答案

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

你必须调用名为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
发布在这里是为了您的方便。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

UPDATE 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();
}

答案 3 :(得分:0)

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