我正在使用System.Windows.Clipboard
复制一些文字,我想知道是否有机会获得原始来源,
例如我复制它的文件,或网站,文件夹......?
由于
答案 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
是其可执行文件的路径。