用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
是其可执行文件的路径。
我正在使用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
是其可执行文件的路径。