La API del Portapapeles data de Windows 3.0 (¿o anterior?) Y está mal diseñada. Desafortunadamente, en lugar de tener primitivas get / set, usa open / close, lo que hace posible que las aplicaciones mantengan su acceso durante demasiado tiempo. Vista aportó algunas mejoras al manejo de la cadena de televidentes, pero no una nueva API.
Con la API existente, es posible identificar al propietario del portapapeles solo si ese propietario también tiene al menos una ventana abierta. Si el propietario no tiene ventanas, entonces uno no tiene suerte.
En el hilo ¿Por qué mi portapapeles dejó de funcionar? , Jay Parzych ha contribuido con el siguiente código vbs donde la función GetClipboardLocker devuelve el nombre de archivo del proceso que contiene el portapapeles:
<DllImport("user32.dll")> _
Public Function GetOpenClipboardWindow() As IntPtr
End Function
<DllImport("user32.dll", SetLastError:=True)> _
Public Function GetWindowThreadProcessId(ByVal hWnd As IntPtr, ByRef lpdwProcessId As Integer) As Integer
End Function
Public Function GetClipboardLocker() As String
Dim hwnd As IntPtr = GetOpenClipboardWindow()
If hwnd <> IntPtr.Zero Then
Dim processId As Integer
GetWindowThreadProcessId(hwnd, processId)
Dim p As Process = Process.GetProcessById(processId)
GetClipboardLocker = p.Modules(0).FileName
Else
GetClipboardLocker = String.Empty
End If
End Function
Se puede encontrar una función C # similar en la publicación
Obtener título / título de los propietarios del Portapapeles .