我正在使用
System.Windows.Clipboard
复制一些文本,我想知道是否有机会获得原始来源,
例如a 我从中复制的文件,或者网站、文件夹...?
谢谢
Win32 GetClipboardOwner() 函数可用于获取最后将数据放入剪贴板的窗口的句柄。
然后您可以将返回的句柄传递给GetWindowThreadProcessId()以获取该窗口的进程ID和线程ID。
回到.NET领域,您可以使用进程ID作为参数传递给
System.Diagnostics.Process.GetProcessById()
方法,以检索所需的信息。
请注意,您必须构建 64 位应用程序才能全面检查 64 位 过程。如果您的项目设置了Prefer 32-bit选项,则某些 信息将不可用。
另请参阅:
如何获取更新剪贴板的应用程序的进程ID或名称?
Windows API 声明。重载的
GetClipboardOwnerProcessID()
包装器方法返回 ClipBoard 所有者的 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()
{
GetWindowThreadProcessId(GetClipboardOwner(), out uint processId);
return processId;
}
//Overload that returns a reference to the Thread ID
public static uint GetClipboardOwnerProcessID(out uint threadId)
{
threadId = GetWindowThreadProcessId(GetClipboardOwner(), out uint processId);
return processId;
}
}
如果您只需要进程 ID,则可以像这样调用包装器:
uint clipBoardOwnerProcessId = WinApi.GetClipboardOwnerProcessID();
或者这样,如果您还需要线程 ID:
uint clipBoardOwnerProcessId = WinApi.GetClipboardOwnerProcessID(out uint clipBoardOwnerThreadId);
将返回值传递给
Process.GetProcessById()
方法:
Process clipBoardOwnerProcess = Process.GetProcessById((int)WinApi.GetClipboardOwnerProcessID());
string ProcessName = clipBoardOwnerProcess.ProcessName;
string ProcessWindowTitle = clipBoardOwnerProcess.MainWindowTitle;
string ProcessFileName = clipBoardOwnerProcess.MainModule.FileName;
//(...)
如果您从浏览器复制一些文本,
ProcessName
将是您的浏览器的名称,ProcessFileName
将是其可执行文件的路径。