จะตรวจสอบแอปพลิเคชันใดที่มีคลิปบอร์ดค้างอยู่


9

เรากำลังปรับใช้เครื่องเสมือนบางส่วนด้วยซอฟต์แวร์หุ่นยนต์ซึ่งดำเนินการในเบราว์เซอร์และเราประสบปัญหากับบางเครื่องเมื่อเข้าถึงคลิปบอร์ดเพื่ออ่านหรือเขียน พวกเขาแสดง "ไม่สามารถเปิดคลิปบอร์ด"

ดังนั้นจึงมีแอปพลิเคชันอื่น ๆ ที่ถือคลิปบอร์ดอยู่

เราจะแก้ไขข้อบกพร่องได้อย่างไร มีเครื่องมือใดบ้างที่สามารถตรวจสอบได้ AFAIK ProcMonไม่ทำงาน

เครื่องจักรคือ Windows XP


สิ่งนี้เกิดขึ้นในการกำหนดค่าการบูตขั้นต่ำหรือไม่?
Ramhound

ซอฟต์แวร์หุ่นยนต์ไม่ทำงานในเซฟโหมดนั่นเป็นปัญหาอย่างหนึ่ง
Áxel Costas Pena

1
ฉันไม่ได้บอกว่าเซฟโหมดฉันพูดในการกำหนดค่าการบูตขั้นต่ำมีความแตกต่าง
Ramhound

คลิปบอร์ดคู่มือ: บันทึกข้อความลงในไฟล์เรียกข้อความในไฟล์นั้นลบไฟล์
Wutnaut

@Ramhound machine มีส่วนประกอบมากมายที่จำเป็นสำหรับกิจกรรมของหุ่นยนต์ เริ่มต้นจากเครื่องที่สะอาดและติดตั้งซอฟต์แวร์ทีละคนจนกว่าจะทำซ้ำข้อผิดพลาดจะมีราคาแพงมาก
Áxel Costas Pena

คำตอบ:


9

Clipboard API วันที่จาก Windows 3.0 (หรือก่อนหน้า?) และได้รับการออกแบบมาไม่ดี น่าเสียดายที่แทนที่จะได้รับ / ตั้งค่าพื้นฐานมันใช้เปิด / ปิดซึ่งทำให้แอปพลิเคชันสามารถระงับการเข้าถึงได้นานเกินไป การปรับปรุงบางอย่างถูกนำมาใช้โดย Vista เพื่อจัดการห่วงโซ่ผู้ชม แต่ไม่มี API ใหม่

ด้วย API ที่มีอยู่แล้วคุณสามารถระบุเจ้าของคลิปบอร์ดได้หากเจ้าของรายนั้นมีหน้าต่างที่เปิดอยู่อย่างน้อยหนึ่งหน้าต่าง หากเจ้าของไม่มีหน้าต่างแสดงว่าไม่มีใครโชคดี

ในหัวข้อเหตุใดคลิปบอร์ดของฉันจึงหยุดทำงาน , Jay Parzych ได้สนับสนุนโค้ด vbs ต่อไปนี้ซึ่งฟังก์ชัน GetClipboardLocker ส่งคืนชื่อไฟล์ของกระบวนการที่เก็บคลิปบอร์ด:

<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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.