C# 获取剪贴板所有者的标题/标题
我正在进行一个项目,该项目不允许用户从一些外部网站复制文本,我能够设置剪贴簿查看器,它正在中断剪贴板,现在我正在尝试获取剪贴板的所有者,然后是窗口的标题/标题,下面是我尝试过的,但它总是返回空C# 获取剪贴板所有者的标题/标题,c#,winapi,clipboard,C#,Winapi,Clipboard,我正在进行一个项目,该项目不允许用户从一些外部网站复制文本,我能够设置剪贴簿查看器,它正在中断剪贴板,现在我正在尝试获取剪贴板的所有者,然后是窗口的标题/标题,下面是我尝试过的,但它总是返回空 protected override void WndProc(ref Message m) { switch ((User32.Message) m.Msg) { case User32.Messag
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
顺便说一句:我在这里提到的函数是WinApi函数…当你开始处理
WM\u DRAWCLIPBOARD
任何更改的内容都可能不再拥有它。但是在WM\u Clipboard Update上,我可以找到所有者,但无法获得标题GetWindowText
,不是GetWindowTitle
。当您开始处理WM\u DRAWCLIPBOARD
任何更改的内容都可能不再拥有它。但是在WM\u Clipboard Update上,我可以找到所有者,但无法获得标题GetWindowText
,不是GetWindowTitle
。有没有其他方法可以实现我上面提到的目标?有没有其他方法可以实现我上面提到的目标