Bagaimana cara memeriksa aplikasi mana yang memiliki penahan clipboard?

9

Kami sedang menyebarkan beberapa mesin virtual dengan perangkat lunak robot yang melakukan tindakan di browser, dan kami mengalami masalah dengan beberapa di antaranya ketika mengakses clipboard untuk membaca atau menulis. Mereka menunjukkan "Tidak dapat membuka clipboard".

Jadi ada aplikasi lain yang memegang clipboard.

Bagaimana kita bisa men-debug itu? Apakah ada alat yang bisa memonitor itu? AFAIK ProcMon tidak melakukan pekerjaan itu.

Mesin adalah Windows XP.

Áxel Costas Pena
sumber
Apakah ini terjadi dalam konfigurasi boot minimal?
Ramhound
Perangkat lunak robot tidak berfungsi dalam mode aman, itulah salah satu kesulitannya
Áxel Costas Pena
1
Saya tidak mengatakan Safe Mode saya katakan dalam konfigurasi boot minimal ada perbedaan.
Ramhound
Papan klip manual: menyimpan teks ke file, memanggil teks dalam file itu, menghapus file.
Wutnaut
@Ramhound machine memiliki banyak komponen yang banyak dibutuhkan untuk aktivitas robot. Mulai dari mesin bersih dan instal perangkat lunak satu per satu hingga mereproduksi bug akan sangat mahal.
Áxel Costas Pena

Jawaban:

9

API Clipboard berasal dari Windows 3.0 (atau sebelumnya?) Dan dirancang dengan buruk. Sayangnya, alih-alih memiliki / menetapkan primitif, ia menggunakan buka / tutup, yang memungkinkan aplikasi untuk menahan aksesnya terlalu lama. Beberapa perbaikan dibawa oleh Vista ke penanganan rantai pemirsa, tetapi tidak ada API baru.

Dengan API yang ada, dimungkinkan untuk mengidentifikasi pemilik clipboard hanya jika pemilik itu juga memiliki setidaknya satu jendela terbuka. Jika pemilik tidak memiliki jendela, maka seseorang tidak beruntung.

Di utas Mengapa clipboard saya berhenti bekerja? , Jay Parzych telah menyumbangkan kode vbs berikut ini di mana fungsi GetClipboardLocker mengembalikan nama file proses memegang clipboard:

<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

Sebuah fungsi yang sama C # dapat ditemukan di pos Dapatkan pemilik Clipboard Judul / Keterangan .

harrymc
sumber
Karena dalam skenario kami, kami dapat memastikan bahwa setiap proses yang dilakukan yang tidak memiliki jendela dibuat, saya akan menandainya sebagai jawaban yang benar. Terima kasih.
Áxel Costas Pena