Come verificare quale applicazione ha negli Appunti?


8

Stiamo implementando alcune macchine virtuali con software robot che esegue azioni in un browser e riscontriamo problemi con alcune di esse quando accediamo agli Appunti per leggere o scrivere. Mostrano un "Impossibile aprire gli appunti".

Quindi c'è qualche altra applicazione che tiene negli Appunti.

Come possiamo eseguire il debug? Esiste uno strumento in grado di monitorarlo? AFAIK ProcMon non fa il lavoro.

Le macchine sono Windows XP.


Questo accade in una configurazione di avvio minima?
Ramhound,

Il software dei robot non funziona in modalità provvisoria, questa è una delle difficoltà
Áxel Costas Pena,

1
Non ho detto che in modalità provvisoria ho detto che in una configurazione di avvio minima c'è una differenza.
Ramhound,

Appunti manuali: salva il testo in un file, chiama il testo in quel file, elimina il file.
Wutnaut,

La macchina @Ramhound ha molti componenti, molti dei quali sono necessari per l'attività del robot. A partire da una macchina pulita e installare il software uno per uno fino a riprodurre il bug sarà molto costoso.
Áxel Costas Pena,

Risposte:


7

L'API degli Appunti risale a Windows 3.0 (o prima?) Ed è mal progettata. Sfortunatamente, invece di avere / impostare primitive, usa open / close, il che rende possibile alle applicazioni di mantenere il suo accesso per troppo tempo. Vista ha apportato alcuni miglioramenti alla gestione della catena di visualizzatori, ma nessuna nuova API.

Con l'API esistente, è possibile identificare il proprietario degli Appunti solo se anche quel proprietario ha almeno una finestra aperta. Se il proprietario non ha finestre, uno è sfortunato.

Nel thread Perché i miei appunti hanno smesso di funzionare? , Jay Parzych ha fornito il seguente codice vbs in cui la funzione GetClipboardLocker restituisce il nome file del processo che contiene gli Appunti:

<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

Una funzione C # simile può essere trovata nel post Ottieni titolari / titolo dei proprietari degli Appunti .


Dal momento che nel nostro scenario, possiamo assicurare che qualsiasi processo che sta facendo che non ha alcuna finestra creata, lo segnerò come risposta giusta. Grazie.
Áxel Costas Pena,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.