2016-08-20 73 views
0

荫尝试使用如下因素四行获得从其他应用程序选定的文本都被选择从其他应用程序的文本,并保持剪贴板中的文本,我还没有这样的问题:如何在同一时间

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 

     } 
    } 
} 
+0

是否将_Clipboard data_更新为新值? –

+0

你是指选定文本的值? –

+0

是的,正如你所说剪贴板数据丢失了。 –

回答

1

试试这个:

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

感谢工作,但它冻结了我的鼠标时,选择文本 –

+1

虽然只保留文字。可以更好地使用'DataObject before = Clipboard.GetDataObject()作为DataObject;' – Nyerguds

0

不确定直线路径来实现 - 试试这个迂回的路线。

虽然发送给SendCtrlC(GetWindowUnderCursor()),你为什么不能尝试用SendCtrlC(GetWindowUnderCursor()+ +老剪贴板数据)

非打印字符 - ASCII的前31个字符不能通过按键板进入

读取旧剪贴板数据并连接

当你正在阅读的数据,您使用相同的非打印字符分裂。