2013-09-26 35 views
0

我正在研究一個項目,該項目不允許用戶從幾個外部網站複製文本,我可以設置一個ClipboarViewer,它正在中斷剪貼板,現在我試圖獲取剪貼板,然後標題的窗口/標題,下面的主人是什麼我都試過,但如果我更改該處理的GetActiveWindow(它總是返回空獲取剪貼板所有者標題/標題

protected override void WndProc(ref Message m) 
     { 
      switch ((User32.Message) m.Msg) 
      { 
       case User32.Message.WM_DRAWCLIPBOARD: 
       { 
        ClipboardChanged(); 

        User32.SendMessage(_nextClipboardViewer, m.Msg, m.WParam, m.LParam); 

        string title = User32.GetWindowTitle(User32.GetClipboardOwner()); 
       } 
       break; 

       case User32.Message.WM_CHANGECBCHAIN: 
       { 
        if (m.WParam == _nextClipboardViewer) 
        { 
         _nextClipboardViewer = m.LParam; 
        } 
        else 
        { 
         User32.SendMessage(_nextClipboardViewer, m.Msg, m.WParam, m.LParam); 
        } 
       } 
       break; 

       case User32.Message.WM_CLIPBOARDUPDATE: 
       { 
        ClipboardChanged(); 

        string title = User32.GetWindowTitle(User32.GetClipboardOwner()); 
       } 
       break; 

       default: 
       { 
        base.WndProc(ref m); 
       } 
       break; 
      } 
     } 


public static string GetWindowTitle(IntPtr hWnd) 
{ 
     StringBuilder Caption = new StringBuilder(256); 

     //hWnd = GetActiveWindow(); 
     GetWindowText(hWnd, Caption, Caption.Capacity); 

     return Caption.ToString(); 
} 

[DllImport("User32.dll", CharSet = CharSet.Auto)] 
public static extern IntPtr GetClipboardOwner(); 

[DllImport("user32", CharSet = CharSet.Auto)] 
     public static extern int GetWindowText(IntPtr hWnd, [Out, MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpString, int nMaxCount); 

[DllImport("user32", CharSet = CharSet.Auto)] 
public static extern IntPtr GetActiveWindow(); 

),那麼它的工作原理是奇怪,因爲GetClipboardOwner()確實返回一個非空的值。

+0

通過你向周圍的處理時間'WM_DRAWCLIPBOARD'任何改變的內容可能不會擁有它了。 –

+0

但在WM_CLIPBOARDUPDATE上,我可以獲得擁有者,但無法獲得標題 –

+0

嘗試使用'GetWindowText',而不是'GetWindowTitle'。 –

回答

1
  1. 當使用OpenClipboard時,不需要應用程序定義窗口句柄。所以你必須意識到有足夠的機會你永遠不會得到結果。
  2. 如果它是一個擁有剪貼板的子窗口,那麼您總是可以使用GetParent來回放窗口堆棧,直到不再有父窗口。

BTW:我在這裏提到是WINAPI函數的函數...

+0

有沒有其他方法可以實現我上面提到的 –