ฉันจะทราบได้อย่างไรว่าตัวจัดการหน้าต่างนั้นเป็นส่วนหนึ่งของ Windows UI ซึ่งตรงข้ามกับแอปพลิเคชันหรือไม่ [ปิด]

ฉันกำลังเขียนสคริปต์ (ใน C# แต่เกือบทุกอย่างได้รับการจัดการผ่าน pinpoke) ซึ่งค้นหาหมายเลขอ้างอิงหน้าต่างใต้ตัวชี้เมาส์และอนุญาตให้ผู้ใช้ดำเนินการบางอย่างกับมัน (โดยพื้นฐานแล้วฟังก์ชันที่เกี่ยวข้องกับการหักมุมหน้าต่างแบบกำหนดเอง)

ฉันไปถึงจุดที่มันใช้งานได้ดีจริงๆ! สามารถย้ายเดสก์ท็อปและทาสก์บาร์ได้ แน่นอนว่านี่เป็นสิ่งที่ฉันไม่ต้องการให้ทำจริงๆ ฉันต้องการให้มันทำงานบน windows ที่ผู้ใช้นำมาใช้เท่านั้น สิ่งต่างๆ เช่น Chrome, Word, Notepad หรือ Teams

มีรายละเอียดที่มีประโยชน์ใดบ้างที่ฉันสามารถดูได้? ฉันได้ลองดูสไตล์หน้าต่างหรือ PID แล้ว แต่ฉันไม่เห็นรูปแบบที่ชัดเจนเกี่ยวกับวิธีตรวจสอบว่า 'หน้าต่าง' นี้เป็นเจ้าของโดยเชลล์ Windows

ฉันรู้แล้วว่า -- ฉันได้ตรวจสอบแล้วว่าตัวจัดการหน้าต่างเป็นของ explorer.exe หรือไม่ แต่นั่นไม่ได้ผลเพราะจะทำให้ผู้ใช้ไม่สามารถย้ายเบราว์เซอร์ไฟล์ปกติได้


person Sidney    schedule 20.08.2020    source แหล่งที่มา
comment
บางทีนี่อาจช่วยได้: (stackoverflow.com/questions/24320758/)   -  person Ryan Wilson    schedule 20.08.2020
comment
คุณต้องคิดให้ออกว่าขอบเขต ของคุณ อยู่ที่ใด... ใครๆ ก็สามารถโต้แย้งได้ว่าแม้แต่แผ่นจดบันทึกก็เป็นส่วนหนึ่งของ Windows อย่างแน่นอน... หลังจากนั้นคำถามนั้นก็ควรจะตอบได้   -  person Alexei Levenkov    schedule 20.08.2020


คำตอบ (1)


หลังจากขุดค้นมาสักพัก ฉันพบคำถามนี้ ซึ่งอ้างอิงถึงฟังก์ชัน GetDesktopWindow() และ GetShellWindow() pinvoid เมื่อใช้ GetShellWindow() api และเป็น pid ฉันสามารถระบุรหัสกระบวนการของเชลล์ windows และเปรียบเทียบกับรหัสกระบวนการของแอปพลิเคชันที่ฉันกำลังย้ายอยู่ ท้ายที่สุด เนื่องจากหน้าต่าง file explorer เป็นส่วนหนึ่งของกระบวนการ explorer ฉันจึงตรวจสอบเพื่อดูว่าหน้าต่างนั้นมี File Explorer เป็นชื่อหรือไม่ หรือมีหน้าต่างหลักหรือไม่

[DllImport("user32.dll", SetLastError = false)]
private static extern IntPtr GetShellWindow();

[DllImport("user32.dll", SetLastError = true)]
private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out IntPtr lpdwProcessId);

public bool IsPartOfWindowsUI
{
  get
  {
      var desktopwindow = new WindowRef(GetShellWindow());
      return (desktopwindow.ThreadProcessID == ThreadProcessID &&
             //Check to see if title of this window or it's parents are
             //Basic file explorer windows 
             !TitleTree.Contains("File Explorer"));
  }
}
person Sidney    schedule 20.08.2020