클립 보드가있는 응용 프로그램을 확인하는 방법은 무엇입니까?


9

브라우저에서 작업을 수행하는 로봇 소프트웨어가 포함 된 일부 가상 머신을 배포하고 있으며 읽기 또는 쓰기를 위해 클립 보드에 액세스 할 때 일부 가상 머신에 문제가 있습니다. "클립 보드를 열 수 없습니다"라는 메시지가 표시됩니다.

따라서 클립 보드를 보유하고있는 다른 응용 프로그램이 있습니다.

어떻게 디버깅 할 수 있습니까? 이를 모니터링 할 수있는 도구가 있습니까? AFAIK ProcMon 은 작업을 수행하지 않습니다.

머신은 Windows XP입니다.


최소 부팅 구성에서이 문제가 발생합니까?
Ramhound

로봇 소프트웨어는 안전 모드에서 작동하지 않습니다. 이는 어려운 문제 중 하나입니다.
Áxel Costas Pena

1
안전 모드라고 말하지 않았지만 최소 부팅 구성에서는 차이가 있다고 말했습니다.
Ramhound

수동 클립 보드 : 텍스트를 파일에 저장하고 해당 파일의 텍스트를 호출 한 다음 파일을 삭제하십시오.
Wutnaut

@Ramhound 기계에는 로봇 활동에 필요한 많은 구성 요소가 있습니다. 깨끗한 기계에서 시작하여 버그를 재현 할 때까지 소프트웨어를 하나씩 설치하면 비용이 매우 많이 듭니다.
Áxel Costas Pena 2016

답변:


9

클립 보드 API는 Windows 3.0 (또는 그 이전 버전)부터 시작되었으며 잘못 설계되었습니다. 불행히도 get / set 프리미티브를 사용하는 대신 open / close를 사용하므로 애플리케이션이 너무 오랫동안 액세스를 유지할 수 있습니다. Vista에서는 뷰어 체인을 처리하는 데 약간의 개선이 있었지만 새로운 API는 없었습니다.

기존 API를 사용하면 클립 보드 소유자가 하나 이상의 열린 창을 가지고있는 경우에만 클립 보드 소유자를 식별 할 수 있습니다. 소유자에게 창문이 없으면 운이 나쁘다.

스레드에서 내 클립 보드가 작동을 멈춘 이유는 무엇입니까? 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 # 함수를 찾을 수 있습니다 .


시나리오에서 창을 만들지 않은 모든 프로세스를 확인할 수 있으므로 정답으로 표시합니다. 감사합니다.
Áxel Costas Pena 2016
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.