API буфера обміну датується з Windows 3.0 (або раніше?) І погано розроблений. На жаль, замість того, щоб отримати / встановити примітиви, він використовує відкритий / закритий, що дозволяє програмам занадто довго утримувати його доступ. Певне поліпшення принесло Vista для управління мережею глядачів, але нового API.
Із наявним API можна ідентифікувати власника буфера обміну, лише якщо цей власник також має принаймні одне відкрите вікно. Якщо у власника немає вікон, то одного не пощастило.
У темі Чому мій буфер обміну перестав працювати? , Jay Parzych вніс наступний код vbs, де функція GetClipboardLocker повертає ім'я файлу процесу, що містить буфер обміну:
<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
Аналогічну функцію C # можна знайти у публікації
Отримати власників буфера обміну Назва / Підпис .