用System.Windows.Clipboard获取原始数据源?

Get the origin data source with System.Windows.Clipboard?

我正在使用System.Windows.Clipboard复制一些文字,我想知道是否有机会获得原始来源, 例如a 我从中复制它的文件,或网站,文件夹.... ?

谢谢

Win32 GetClipboardOwner() 函数可用于获取最后将数据放入剪贴板的 Window 的句柄。

然后您可以将返回的句柄传递给 GetWindowThreadProcessId() 以获取 Window 的进程 ID 和线程 ID。

回到 .Net 领域,您可以使用进程 ID 作为参数传递给 System.Diagnostics.Process.GetProcessById() 方法,以检索所需的信息。

Note that you have to build a 64bit application to fully inspect a 64bit process. If your project has the Prefer 32-bit option set, some information will not be available.

另请参阅:


Windows API 声明。重载的 GetClipboardOwnerProcessID() 包装器方法 returns 剪贴板所有者的 ProcessID 以及可选的线程 ID。

public class WinApi
{
    [DllImport("user32.dll")]
    private static extern IntPtr GetClipboardOwner();

    //The return value is the identifier of the thread that created the window. 
    [DllImport("user32.dll", SetLastError = true)]
    private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

    //Wrapper used to return the Window processId
    public static uint GetClipboardOwnerProcessID()
    {
        uint processId = 0;
        GetWindowThreadProcessId(SafeNativeMethods.GetClipboardOwner(), out processId);
        return processId;
    }

    //Overload that returns a reference to the Thread ID
    public static uint GetClipboardOwnerProcessID(ref uint threadId)
    {
        uint processId = 0;
        threadId = GetWindowThreadProcessId(SafeNativeMethods.GetClipboardOwner(), out processId);
        return processId;
    }
}

包装器可以这样调用,如果你只需要进程ID:

uint ClipBoadrOwnerProcessId = WinApi.GetClipboardOwnerProcessID();

或者这样,如果您还需要线程 ID:

uint ClipBoadrOwnerThreadId = 0;
uint ClipBoadrOwnerProcessId = WinApi.GetClipboardOwnerProcessID(ref ClipBoadrOwnerThreadId);

将返回值传递给Process.GetProcessById()方法:

Process ClipBoardOwnerProcess = Process.GetProcessById((int)WinApi.GetClipboardOwnerProcessID());
    
string ProcessName = ClipBoardOwnerProcess.ProcessName;
string ProcessWindowTitle = ClipBoardOwnerProcess.MainWindowTitle;
string ProcessFileName = ClipBoardOwnerProcess.MainModule.FileName;
//(...)

如果您从浏览器复制一些文本,ProcessName 将是您浏览器的名称,ProcessFileName 是其可执行文件的路径。