クリップボードが保持されているアプリケーションを確認するにはどうすればよいですか?


9

ブラウザでアクションを実行するロボットソフトウェアを備えた仮想マシンをデプロイしていますが、読み取りまたは書き込みのためにクリップボードにアクセスするときに、一部の仮想マシンで問題が発生しています。「クリップボードを開けません」と表示されます。

したがって、クリップボードを保持している他のアプリケーションがあります。

どうすればデバッグできますか?それを監視できるツールはありますか?AFAIK ProcMonは仕事をしません。

マシンはWindows XPです。


これは最小ブート構成で発生しますか?
ラムハウンド2014年

ロボットソフトウェアは、困難の一つであるセーフモードでの仕事、しません
アクセル・コスタスペーニャ

1
セーフモードとは言いませんでしたが、最小限のブート構成では違いがあります。
ラムハウンド2014年

手動クリップボード:テキストをファイルに保存し、そのファイル内のテキストを呼び出し、ファイルを削除します。
Wutnaut 2014年

@Ramhoundマシンには、ロボットの活動に必要な多くのコンポーネントがあります。クリーンなマシンから始めて、バグを再現するまでソフトウェアを1つずつインストールすると、非常に費用がかかります。
–ÁxelCostas Pena 2014

回答:


9

クリップボードAPIはWindows 3.0(またはそれ以前)のもので、設計が不適切です。残念ながら、プリミティブを取得/設定する代わりに、オープン/クローズを使用します。これにより、アプリケーションがそのアクセスを長時間保持することが可能になります。Vistaによってビューアチェーンの処理が改善されましたが、新しいAPIはありませんでした。

既存のAPIを使用すると、その所有者が少なくとも1つの開いているウィンドウも持っている場合にのみ、クリップボードの所有者を識別することができます。所有者に窓がない場合、1つは運が悪いです。

スレッド内クリップボードが機能しなくなったのはなぜですか?、Jay Parzychは、GetClipboardLocker関数がクリップボードを保持しているプロセスのファイル名を返す次のvbsコードを提供しました。

<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

同様のC#関数はGet Clipboard owners Title / Captionの投稿にあり ます


このシナリオでは、ウィンドウが作成されていないプロセスを実行していることを確認できるので、これを正解としてマークします。ありがとうございました。
アクセルコスタスペナ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.