Copy and Modify selected text in different application

前端 未结 4 1907
陌清茗
陌清茗 2020-12-05 09:11

I have a windows application running at the backend. I have functions in this applications mapped to hot keys. Like if I put a message box into this function and give hot ke

相关标签:
4条回答
  • 2020-12-05 09:26

    Use the Clipboard class to copy the contents to the clipboard, then paste in the notepad.

    You could also write the contents to a text file and open it with notepad by running the notepad.exe application with the text file's path as a command line parameter.

    0 讨论(0)
  • 2020-12-05 09:26

    UPDATE 2020

    How to get the selected text from the foreground window

    No idea for how long has this been possible but instead of fighting with Win32 programming (mostly user32.dll and various Windows messages like WM_GETTEXT, WM_COPY and various SendMessage(handle, WM_GETTEXT, maxLength, sb) calls) which is advised in most of SO threads on this topic, I easily managed to access selected text in any window in my C# code followingly:

    // 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);
    

    Here the methods being called:

    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();
    }
    
    0 讨论(0)
  • 2020-12-05 09:35

    I think you can use SendInput function to send the text to the target window or just the command to paste it if you have put it in clipboard before.

    0 讨论(0)
  • 2020-12-05 09:39

    Your question has two answers

    How can my app set a global hotkey

    You have to call an API funcion called RegisterHotKey

    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
    );
    

    More info here: http://www.codeproject.com/KB/system/nishhotkeys01.aspx

    How to get the selected text from the foreground window

    Easiest way is to send crl-C to the window and then capture the clipboard content.

    [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
    
    }
    

    Disclaimer: Code by Marcus Peters from here: http://bytes.com/forum/post1029553-5.html
    Posted here for your convenience.

    0 讨论(0)
提交回复
热议问题