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

问题描述 投票:10回答:4

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

现在,我想在此函数内编写代码,以便在使用其他应用程序(如记事本)时,选择特定的文本行并按热键Alt + Ctrl + D 应该复制所选文本,并在其后附加“ _copied”,然后将其粘贴回记事本。

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

c# .net clipboard hotkeys
4个回答
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
投票

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

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


0
投票

我想您可以使用SendInput函数将文本发送到目标窗口,或者如果您之前将其放置在剪贴板中,也可以使用将其粘贴的命令。


0
投票

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();
}
© www.soinside.com 2019 - 2024. All rights reserved.