2016-08-20 86 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個字符不能通過按鍵板進入

讀取舊剪貼板數據並連接

當你正在閱讀的數據,您使用相同的非打印字符分裂。