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

时间:2018-02-16 20:07:16

标签: c# console clipboard

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

由于

1 个答案:

答案 0 :(得分:2)

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

然后将返回的句柄传递给GetWindowThreadProcessId()以获取该窗口的进程ID和线程ID。

进程ID是传递给.Net System.Diagnostics.Process.GetProcessById()方法以检索所需信息的参数。

  

请注意,您必须构建一个64位应用程序才能完全检查64位   处理。如果您的项目设置了首选32位选项,则可以设置一些   信息将无法获得。

Windows API声明。重载的GetClipboardOwnerProcessID()包装器方法返回ClipBoard所有者的ProcessID,并且可选地返回其线程ID。

public class WinApi
{
    [SuppressUnmanagedCodeSecurityAttribute]
    internal static class SafeNativeMethods
    {
        [DllImport("user32.dll")]
        public static extern IntPtr GetClipboardOwner();
    }

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

    //Wrapper used to return the Window processId
    public static uint GetClipboardOwnerProcessID()
    {
        uint processId = 0;
        UnsafeNativeMethods.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 = UnsafeNativeMethods.GetWindowThreadProcessId(SafeNativeMethods.GetClipboardOwner(), out processId);
        return processId;
    }
}


如果您只需要Process 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是其可执行文件的路径。