2013-09-26 2 views
0

Я работаю над проектом, который не позволит пользователям копировать текст с нескольких внешних веб-сайтов, мне удалось настроить ClipboarViewer, и это прерывает буфер обмена, теперь я пытаюсь получить владелец буфера обмена и затем заголовка/заголовок окна, ниже того, что я пытался, но он всегда возвращает пустойПолучить владельца буфера обмена Название/Caption

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

если изменить обработчик в GetActiveWindow(), то она работает, что странно, потому что GetClipboardOwner() возвращает значение, которое не равно null.

+0

К тому времени, когда вы вокруг обработки 'WM_DRAWCLIPBOARD' независимо изменено содержимое не может владеть ею больше. –

+0

, но на WM_CLIPBOARDUPDATE Я могу получить владельца, но не могу получить заголовок –

+0

Попробуйте 'GetWindowText', а не' GetWindowTitle'. –

ответ

1
  1. Нет необходимости, чтобы приложение определяло дескриптор окна при использовании OpenClipboard. Поэтому вы должны знать, что есть достаточно шансов, что вы никогда не получите результат.
  2. Если это дочернее окно, которому принадлежит буфер обмена, вы можете пройти стек окон, всегда используя GetParent, пока не будет родитель.

КСТАТИ: Функция я упоминаю здесь функции WinAPI ...

+0

Есть ли другой способ, которым я могу достичь того, что я упомянул выше –

Смежные вопросы