如何从其他应用程序中获取所选文本并同时保留剪贴板文本

Hamreen Ahmad |

我试图使用以下四行从其他应用程序中获取选定的文本,我对此没有问题:

Thread.Sleep(20);
SendCtrlC(GetWindowUnderCursor());
Thread.Sleep(30);
label1.Text = Clipboard.GetText();

我的问题是,同时我想保留剪贴板文本,因为SendCtrlC(GetWindowUnderCursor());更改了剪贴板文本,为此我使用了before类似以下代码的变量

string before = ""; //use before to keep clipboard text

//keep clipboard text
IDataObject iData = Clipboard.GetDataObject();
if (iData.GetDataPresent(DataFormats.Text))
before = ((String)iData.GetData(DataFormats.Text));

//get selected text
Thread.Sleep(20);
SendCtrlC(GetWindowUnderCursor());
Thread.Sleep(30);
label1.Text = Clipboard.GetText();

//return clipboard text back
Clipboard.SetText(before);

但这并不能使文本和剪贴板数据仍然丢失……
有人知道原因是什么?

这是所有代码:

using MouseKeyboardActivityMonitor;
using MouseKeyboardActivityMonitor.WinApi;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private readonly KeyboardHookListener m_KeyboardHookManager;
        private readonly MouseHookListener m_MouseHookManager;
        private bool ctrlHeld;
        string pressedKey;
        public Form1()
        {
            InitializeComponent();

            m_KeyboardHookManager = new KeyboardHookListener(new GlobalHooker());
            m_KeyboardHookManager.Enabled = true;
            m_KeyboardHookManager.KeyDown += HookManager_KeyDown;
            m_KeyboardHookManager.KeyUp += HookManager_KeyUp;

            m_MouseHookManager = new MouseHookListener(new GlobalHooker());
            m_MouseHookManager.Enabled = true;
            m_MouseHookManager.MouseDown += HookManager_MouseDown;
            m_MouseHookManager.MouseUp += HookManager_MouseUp;

        }

        private void HookManager_KeyDown(object sender, KeyEventArgs e)
        {
            pressedKey = e.KeyCode + "";
            if (pressedKey == "LControlKey")
            {
                ctrlHeld = true;
            }
        }

        private void HookManager_KeyUp(object sender, KeyEventArgs e)
        {
            pressedKey = e.KeyCode + "";
            if (pressedKey == "LControlKey")
            {
                ctrlHeld = false;
            }
        }

        private void HookManager_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left && (ctrlHeld))
            {
                string before = "";

                IDataObject iData = Clipboard.GetDataObject();
                if (iData.GetDataPresent(DataFormats.Text))
                    before = ((String)iData.GetData(DataFormats.Text));

                Thread.Sleep(20);
                SendCtrlC(GetWindowUnderCursor());
                Thread.Sleep(30);
                label1.Text = Clipboard.GetText();

                Clipboard.SetText(before);

            }
        }


        private void HookManager_MouseDown(object sender, MouseEventArgs e)
        {

        }


        [DllImport("user32.dll")]
        public static extern IntPtr WindowFromPoint(Point lpPoint);

        [DllImport("user32.dll")]
        public static extern bool GetCursorPos(out Point lpPoint);

        public static IntPtr GetWindowUnderCursor()
        {
            Point ptCursor = new Point();

            if (!(Form1.GetCursorPos(out ptCursor)))
                return IntPtr.Zero;

            return WindowFromPoint(ptCursor);
        }

        /////////////////////////////////////////////////////////

        [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

        }
    }
}
用户名

试试这个:

// Get previous selcetd text
string before = Clipboard.GetText(TextDataFormat.UnicodeText);

// Get the selected text
Thread.Sleep(20);
SendCtrlC(GetWindowUnderCursor());
Thread.Sleep(30);
label1.Text = Clipboard.GetText(TextDataFormat.UnicodeText);

// Set the clipboard text back to the original value.
Clipboard.SetDataObject(before, false, 10, 2000);
// Clipboard.SetDataObject(string value, ignore this, try changing the clipboard a few times, the delay inbetween trying to chnage it in milliseconds);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Chrome扩展程序获取所选文本

来自分类Dev

可访问性API替代方案,可从osx中的任何应用程序中获取所选文本

来自分类Dev

如何在Go中将文本复制到剪贴板或从剪贴板复制文本?

来自分类Dev

如何使用JavaScript将所选文本复制到剪贴板

来自分类Dev

Metro应用程序中的ComboBox如何获取所选文本及其相关ID

来自分类Dev

如何从Python中的任何应用程序捕获剪贴板事件(等效于onChangeClipboard)

来自分类Dev

是否可以找出哪个应用程序将文本插入剪贴板?

来自分类Dev

如何在WinForms应用程序中创建自定义剪贴板格式

来自分类Dev

从剪贴板读取文本

来自分类Dev

LibreOffice与其他应用程序之间的剪贴板操作

来自分类Dev

如何同时从剪贴板获取文本及其格式?

来自分类Dev

如何检测剪贴板文本更改?

来自分类Dev

如何获取已更新剪贴板的应用程序的进程ID或名称?

来自分类Dev

打开应用程序时如何阅读Android剪贴板(文本)?

来自分类Dev

LibreOffice与其他应用程序之间的剪贴板操作

来自分类Dev

使用C#获取在其他应用程序的文本框中输入的文本

来自分类Dev

如何在剪贴板中复制按钮的文本?

来自分类Dev

TeamViewer远程计算机应用程序设置本地计算机剪贴板文本

来自分类Dev

如何创建将文本复制到剪贴板的自定义应用程序启动器?

来自分类Dev

Ctrl + C复制网页文本-将其他数据复制到剪贴板

来自分类Dev

sed:如何在保留所选文本的同时保留所选文本的同时替换文本?

来自分类Dev

如何在Microsoft Office应用程序中获取剪贴板的当前文档路径?

来自分类Dev

如何将(大)vim文件的内容复制到OSX系统剪贴板中以粘贴到其他应用程序中?

来自分类Dev

当来自复制文本的程序退出时,保留剪贴板的内容

来自分类Dev

从剪贴板Java获取文本到jtextfield

来自分类Dev

如何使用按钮将剪贴板中的文本粘贴到选定的文本框中

来自分类Dev

无法从其他应用程序获取文本(窗口)

来自分类Dev

如何从PDF复制文本并将其粘贴到其他保留文本格式的应用程序中?

来自分类Dev

UWP:获取剪贴板文本

Related 相关文章

  1. 1

    Chrome扩展程序获取所选文本

  2. 2

    可访问性API替代方案,可从osx中的任何应用程序中获取所选文本

  3. 3

    如何在Go中将文本复制到剪贴板或从剪贴板复制文本?

  4. 4

    如何使用JavaScript将所选文本复制到剪贴板

  5. 5

    Metro应用程序中的ComboBox如何获取所选文本及其相关ID

  6. 6

    如何从Python中的任何应用程序捕获剪贴板事件(等效于onChangeClipboard)

  7. 7

    是否可以找出哪个应用程序将文本插入剪贴板?

  8. 8

    如何在WinForms应用程序中创建自定义剪贴板格式

  9. 9

    从剪贴板读取文本

  10. 10

    LibreOffice与其他应用程序之间的剪贴板操作

  11. 11

    如何同时从剪贴板获取文本及其格式?

  12. 12

    如何检测剪贴板文本更改?

  13. 13

    如何获取已更新剪贴板的应用程序的进程ID或名称?

  14. 14

    打开应用程序时如何阅读Android剪贴板(文本)?

  15. 15

    LibreOffice与其他应用程序之间的剪贴板操作

  16. 16

    使用C#获取在其他应用程序的文本框中输入的文本

  17. 17

    如何在剪贴板中复制按钮的文本?

  18. 18

    TeamViewer远程计算机应用程序设置本地计算机剪贴板文本

  19. 19

    如何创建将文本复制到剪贴板的自定义应用程序启动器?

  20. 20

    Ctrl + C复制网页文本-将其他数据复制到剪贴板

  21. 21

    sed:如何在保留所选文本的同时保留所选文本的同时替换文本?

  22. 22

    如何在Microsoft Office应用程序中获取剪贴板的当前文档路径?

  23. 23

    如何将(大)vim文件的内容复制到OSX系统剪贴板中以粘贴到其他应用程序中?

  24. 24

    当来自复制文本的程序退出时,保留剪贴板的内容

  25. 25

    从剪贴板Java获取文本到jtextfield

  26. 26

    如何使用按钮将剪贴板中的文本粘贴到选定的文本框中

  27. 27

    无法从其他应用程序获取文本(窗口)

  28. 28

    如何从PDF复制文本并将其粘贴到其他保留文本格式的应用程序中?

  29. 29

    UWP:获取剪贴板文本

热门标签

归档