Wie überprüfe ich, welche Anwendung in der Zwischenablage gespeichert ist?

9

Wir stellen einige virtuelle Maschinen mit Robotersoftware bereit, die Aktionen in einem Browser ausführt, und wir haben Probleme mit einigen davon, wenn wir zum Lesen oder Schreiben auf die Zwischenablage zugreifen. Sie zeigen eine "Zwischenablage kann nicht geöffnet werden".

Es gibt also eine andere Anwendung, die die Zwischenablage enthält.

Wie können wir das debuggen? Gibt es ein Tool, das das überwachen kann? AFAIK ProcMon nicht die Arbeit machen.

Maschinen sind Windows XP.

Áxel Costas Pena
quelle
Geschieht dies in einer minimalen Startkonfiguration?
Ramhound
Die Robotersoftware funktioniert nicht im abgesicherten Modus, das ist eine der Schwierigkeiten
Áxel Costas Pena
1
Ich habe nicht "Abgesicherter Modus" gesagt. Bei einer minimalen Startkonfiguration gibt es einen Unterschied.
Ramhound
Manuelle Zwischenablage: Speichern Sie den Text in einer Datei, rufen Sie den Text in dieser Datei auf und löschen Sie die Datei.
Wutnaut
Die @ Ramhound-Maschine verfügt über viele Komponenten, von denen viele für die Roboteraktivität benötigt werden. Es ist sehr teuer, von einer sauberen Maschine aus zu starten und die Software einzeln zu installieren, bis der Fehler reproduziert wird.
Áxel Costas Pena

Antworten:

9

Die API für die Zwischenablage stammt aus Windows 3.0 (oder früher?) Und ist schlecht gestaltet. Leider werden anstelle von get / set-Grundelementen open / close verwendet, wodurch Anwendungen ihren Zugriff viel zu lange behalten können. Vista hat die Handhabung der Viewer-Kette etwas verbessert, aber keine neue API.

Mit der vorhandenen API ist es nur möglich, den Eigentümer der Zwischenablage zu identifizieren, wenn dieser Eigentümer auch mindestens ein geöffnetes Fenster hat. Wenn der Besitzer keine Fenster hat, hat man Pech.

Im Thread Warum funktioniert meine Zwischenablage nicht mehr? , Jay Parzych hat den folgenden vbs-Code beigesteuert, in dem die GetClipboardLocker-Funktion den Dateinamen des Prozesses zurückgibt, der die Zwischenablage enthält:

<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

Eine ähnliche C # -Funktion finden Sie im Beitrag Titel / Beschriftung der Zwischenablage-Besitzer abrufen .

harrymc
quelle
Da wir in unserem Szenario sicherstellen können, dass für jeden Prozess, der dies tut, kein Fenster erstellt wurde, werde ich es als richtige Antwort markieren. Vielen Dank.
Áxel Costas Pena