Bagaimana saya bisa menentukan apakah, dengan adanya pegangan jendela, pegangan jendela adalah bagian dari UI Windows dan bukan suatu aplikasi? [tertutup]

Saya sedang menulis skrip (dalam C#, tetapi hampir semuanya ditangani melalui pinvoke) yang menemukan pegangan jendela di bawah penunjuk tetikus dan memungkinkan pengguna untuk mengambil beberapa tindakan terhadapnya (terutama fungsi terkait gertakan jendela yang dibatasi khusus).

Saya sudah mencapai titik di mana ia bekerja dengan sangat baik! Dapat memindahkan desktop dan taskbar. Tentu saja ini adalah sesuatu yang sebenarnya tidak saya inginkan. Saya hanya ingin ini berfungsi pada windows yang dibuat oleh pengguna; hal-hal seperti Chrome, Word, Notepad, atau Teams.

Apakah ada gambaran praktis yang bisa saya lihat? Saya sudah mencoba melihat gaya jendela, atau PID, tetapi saya tidak melihat pola yang jelas tentang cara mendeteksi 'jendela' ini dimiliki oleh shell Windows.

Saya menyadari -- Saya telah memeriksa apakah pegangan jendela milik explorer.exe, tetapi itu tidak berhasil karena mencegah pengguna memindahkan browser file biasa.


person Sidney    schedule 20.08.2020    source sumber
comment
Mungkin ini akan membantu: (stackoverflow.com/questions/24320758/)   -  person Ryan Wilson    schedule 20.08.2020
comment
Anda benar-benar perlu mencari tahu di mana batas Anda... Ada yang berpendapat bahwa bahkan notepad jelas merupakan bagian dari Windows... Setelah itu pertanyaan itu harus bisa dijawab.   -  person Alexei Levenkov    schedule 20.08.2020


Jawaban (1)


Setelah menggali beberapa kali, saya menemukan pertanyaan ini yang mereferensikan fungsi pinvoke GetDesktopWindow() dan GetShellWindow(). Dengan menggunakan api GetShellWindow() dan pidnya, saya dapat menentukan ID proses shell windows, dan membandingkannya dengan ID proses aplikasi yang sedang saya pindahkan. Terakhir, karena jendela file explorer adalah bagian dari proses penjelajah, saya memeriksa apakah jendela tersebut memiliki File Explorer sebagai judulnya, atau apakah ada jendela induknya yang memilikinya.

[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