【问题标题】:Get Clipboard owners Title/Caption获取剪贴板所有者标题/标题
【发布时间】:2013-09-26 18:43:38
【问题描述】:

我正在开发一个不允许用户从几个外部网站复制文本的项目,我能够设置 ClipboarViewer 并且它正在中断剪贴板,现在我正在尝试获取剪贴板的所有者和然后是窗口的标题/标题,下面是我尝试过的,但它总是返回空

    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() 确实返回了一个不为空的值。

【问题讨论】:

  • 当您开始处理 WM_DRAWCLIPBOARD 时,无论内容发生了什么变化,都可能不再拥有它。
  • 但是在 WM_CLIPBOARDUPDATE 我可以得到所有者但无法得到标题
  • 试试GetWindowText,而不是GetWindowTitle

标签: c# winapi clipboard


【解决方案1】:
  1. 使用 OpenClipboard 时,应用程序无需定义窗口句柄。所以你必须意识到有足够的机会你永远不会得到结果。
  2. 如果它是拥有剪贴板的子窗口,您可以始终使用 GetParent 退回窗口堆栈,直到不再有父窗口。

顺便说一句:我这里提到的函数是 WinApi 函数...

【讨论】:

  • 有没有其他方法可以实现我上面提到的目标
猜你喜欢
  • 2020-07-26
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多