API Clipboard có từ Windows 3.0 (hoặc trước đó?) Và được thiết kế tồi. Thật không may, thay vì có các nguyên hàm get / set, nó sử dụng open / close, điều này khiến các ứng dụng có thể giữ quyền truy cập của nó quá lâu. Một số cải tiến đã được Vista mang đến để xử lý chuỗi người xem, nhưng không có API mới.
Với API hiện có, chỉ có thể xác định chủ sở hữu của bảng tạm nếu chủ sở hữu đó cũng có ít nhất một cửa sổ mở. Nếu chủ sở hữu không có cửa sổ, thì người ta đã hết may mắn.
Trong chủ đề Tại sao clipboard của tôi ngừng hoạt động? , Jay Parzych đã đóng góp mã vbs sau trong đó hàm GetClipboardLocker trả về tên tệp của quá trình giữ bảng tạm:
<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
Một chức năng C # tương tự có thể được tìm thấy trong bài đăng
Tiêu đề / chú thích của chủ sở hữu Clipboard .