Làm thế nào để kiểm tra ứng dụng nào có bảng giữ tạm?


9

Chúng tôi đang triển khai một số máy ảo với phần mềm robot thực hiện các hành động trong trình duyệt và chúng tôi gặp sự cố với một số trong số chúng khi truy cập vào bảng tạm để đọc hoặc ghi. Họ hiển thị một "Không thể mở clipboard".

Vì vậy, có bất kỳ ứng dụng khác giữ bảng tạm.

Làm thế nào chúng ta có thể gỡ lỗi đó? Có công cụ nào có thể theo dõi điều đó không? AFAIK ProcMon không thực hiện công việc.

Máy là Windows XP.


Điều này xảy ra trong một cấu hình khởi động tối thiểu?
Ramhound

Phần mềm robot không hoạt động ở chế độ an toàn, đó là một trong những khó khăn
Áxel Costas Pena

1
Tôi không nói Chế độ an toàn Tôi đã nói trong một cấu hình khởi động tối thiểu có một sự khác biệt.
Ramhound

Hướng dẫn sử dụng: lưu văn bản vào một tệp, gọi văn bản trong tệp đó, xóa tệp.
Wutnaut

Máy @Ramhound có rất nhiều thành phần cần thiết cho hoạt động của robot. Bắt đầu từ một máy sạch và cài đặt từng phần mềm một cho đến khi tái tạo lỗi sẽ rất tốn kém.
Áxel Costas Pena

Câu trả lời:


9

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 .


Vì trong kịch bản của chúng tôi, chúng tôi có thể đảm bảo rằng bất kỳ quy trình nào đang thực hiện mà không có cửa sổ nào được tạo, tôi sẽ đánh dấu nó là câu trả lời đúng. Cảm ơn bạn.
Áxel Costas Pena
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.