Comment vérifier quelle application le presse-papiers contient?

9

Nous déployons certaines machines virtuelles avec un logiciel de robot qui exécute des actions dans un navigateur, et nous avons des problèmes avec certaines d'entre elles lors de l'accès au presse-papiers pour la lecture ou l'écriture. Ils affichent un "Presse-papiers impossible".

Il existe donc toute autre application contenant le presse-papiers.

Comment pouvons-nous déboguer cela? Y a-t-il un outil qui peut surveiller cela? AFAIK ProcMon ne fait pas le travail.

Les machines sont Windows XP.

Áxel Costas Pena
la source
Cela se produit-il dans une configuration de démarrage minimale?
Ramhound
Le logiciel des robots ne fonctionne pas en mode sans échec, c'est l'une des difficultés
Áxel Costas Pena
1
Je n'ai pas dit Mode sans échec J'ai dit que dans une configuration de démarrage minimale, il y a une différence.
Ramhound
Presse-papiers manuel: enregistrez le texte dans un fichier, appelez le texte dans ce fichier, supprimez le fichier.
Wutnaut
La machine @Ramhound a beaucoup de composants dont une grande partie est nécessaire pour l'activité du robot. Partir d'une machine propre et installer le logiciel un par un jusqu'à ce que la reproduction du bogue soit très coûteux.
Áxel Costas Pena

Réponses:

9

L'API Clipboard date de Windows 3.0 (ou avant?) Et est mal conçue. Malheureusement, au lieu d'avoir des primitives get / set, il utilise open / close, ce qui permet aux applications de maintenir son accès trop longtemps. Vista a apporté une amélioration à la gestion de la chaîne des téléspectateurs, mais pas de nouvelle API.

Avec l'API existante, il est possible d'identifier le propriétaire du presse-papiers uniquement si ce propriétaire a également au moins une fenêtre ouverte. Si le propriétaire n'a pas de fenêtre, alors on n'a pas de chance.

Dans le fil de discussion Pourquoi mon presse-papiers ne fonctionne plus? , Jay Parzych a contribué le code vbs suivant où la fonction GetClipboardLocker renvoie le nom de fichier du processus contenant le presse-papiers:

<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

Une fonction C # similaire peut être trouvée dans la publication Obtenir le titre / légende des propriétaires du Presse-papiers .

harrymc
la source
Étant donné que dans notre scénario, nous pouvons garantir que tout processus en cours qui n'a pas de fenêtre créée, je vais le marquer comme la bonne réponse. Je vous remercie.
Áxel Costas Pena