hWnd bir düğme olup olmadığını kontrol edin

Bir hndnd bir düğme olup olmadığını kontrol etmek istiyorum.

Bu kod hWnd'yi almak içindir:

public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);

[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i);


public static List GetChildWindows(IntPtr parent)
{
    List result = new List();
    GCHandle listHandle = GCHandle.Alloc(result);
    try
    {
        EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
        EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
    }
    finally
    {
        if (listHandle.IsAllocated)
            listHandle.Free();
    }
    return result;
}

Şimdi bulmam gerekiyor, listenin hangisinin bir düğme olduğunu. Teşekkürler

0
Lütfen ne demek istediğinizi "düğme" ile tanımlayın
katma yazar David Heffernan, kaynak
Kabul ettiğiniz cevabınız ile düğme tanımınızın "Düğme" sınıfına sahip bir pencere olduğu anlaşılıyor. Bu, son derece sınırlı bir düğme tanımıdır.
katma yazar David Heffernan, kaynak
Kabul ettiğiniz cevabınız ile düğme tanımınızın "Düğme" sınıfına sahip bir pencere olduğu anlaşılıyor. Bu, son derece sınırlı bir düğme tanımıdır.
katma yazar David Heffernan, kaynak
Raymond'ın sorusuna cevap vermek için: hayır UI Otomasyonu . UI Automation ile devam etmenin çarpıcı bir nedeni var: Ayrıca, yerel Windows kontrolleri olmayan kontrolleri tanımlamanıza da izin veriyor (örneğin, bir web sayfasındaki düğmeler, Qt veya GTK gibi araç setleri ile oluşturulmuş düğme widget'ları veya wpf kontrolleri) . Önerilen çözüm yukarıda belirtilenlerin hepsini özleyecektir.
katma yazar IInspectable, kaynak
Raymond'ın sorusuna cevap vermek için: hayır UI Otomasyonu . UI Automation ile devam etmenin çarpıcı bir nedeni var: Ayrıca, yerel Windows kontrolleri olmayan kontrolleri tanımlamanıza da izin veriyor (örneğin, bir web sayfasındaki düğmeler, Qt veya GTK gibi araç setleri ile oluşturulmuş düğme widget'ları veya wpf kontrolleri) . Önerilen çözüm yukarıda belirtilenlerin hepsini özleyecektir.
katma yazar IInspectable, kaynak
Neden System.Windows.Automation kullanılmıyor?
katma yazar Raymond Chen, kaynak
Neden System.Windows.Automation kullanılmıyor?
katma yazar Raymond Chen, kaynak

6 cevap

Windows Düğmeleri pencere sınıfı BUTTON'dur. GetClassName Bir düğmenin bir düğme olup olmadığını keşfetmek için.

Günümüzde pek çok uygulamanın Windows denetimlerini kullanmadığını ve BUTTON sınıfını kullanmayan bir düğme olabileceğini unutmayın. Bazı uygulamalar (örneğin web tarayıcıları veya

wpf uygulamaları) bile tamamen "sahip" çizilir ve hiç bir pencere kontrolü kullanmaz ("konteyner" penceresi dışında).

Once upon a time there was a very useful tool, Spy++, to check the windows. It was very useful to comprehend how the UI of programs were built. Mmmh... Still present in Visual Studio: on my machine (Visual Studio 2013): C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\spyxx.exe

3
katma

Windows Düğmeleri pencere sınıfı BUTTON'dur. GetClassName Bir düğmenin bir düğme olup olmadığını keşfetmek için.

Günümüzde pek çok uygulamanın Windows denetimlerini kullanmadığını ve BUTTON sınıfını kullanmayan bir düğme olabileceğini unutmayın. Bazı uygulamalar (örneğin web tarayıcıları veya

wpf uygulamaları) bile tamamen "sahip" çizilir ve hiç bir pencere kontrolü kullanmaz ("konteyner" penceresi dışında).

Once upon a time there was a very useful tool, Spy++, to check the windows. It was very useful to comprehend how the UI of programs were built. Mmmh... Still present in Visual Studio: on my machine (Visual Studio 2013): C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\spyxx.exe

3
katma

Hwnd'nin win32 sınıfını bulmak için "GetClassName" işlevini kullanabilirsiniz. Standart win32 düğmeleri için her zaman 'Düğme' olacaktır. Bu şekilde kullanabilirsiniz:

public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName,int nMaxCount);

[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i);

public static List GetChildButtons(IntPtr parent)
{
    List result = new List();
    GCHandle listHandle = GCHandle.Alloc(result);
    try
    {
        EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
        EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
    }
    finally
    {
        if (listHandle.IsAllocated)
            listHandle.Free();
    }
    return result
        .Where(x => {
            StringBuilder buffer = new StringBuilder(128);
            GetClassName(x, buffer, buffer.Capacity);
            return buffer.ToString() == "Button";
        })
        .ToList();
}
1
katma
BUTTON olmadığından emin misin? Her halükarda, bugünlerde butonlara benzer butonların çoğunun BUTON pencereleri olmadığını söyleyebilirim.
katma yazar David Heffernan, kaynak
msdn.microsoft’a göre .com/tr-us/library/windows/desktop/& hellip; ve spy ++ ile kısa bir test "Düğme". Tabii ki bu sadece düğmeler yerel olduğunda işe yarar, varsayılan win32 düğmeleri ...
katma yazar Marvin, kaynak

Hwnd'nin win32 sınıfını bulmak için "GetClassName" işlevini kullanabilirsiniz. Standart win32 düğmeleri için her zaman 'Düğme' olacaktır. Bu şekilde kullanabilirsiniz:

public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName,int nMaxCount);

[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i);

public static List GetChildButtons(IntPtr parent)
{
    List result = new List();
    GCHandle listHandle = GCHandle.Alloc(result);
    try
    {
        EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
        EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
    }
    finally
    {
        if (listHandle.IsAllocated)
            listHandle.Free();
    }
    return result
        .Where(x => {
            StringBuilder buffer = new StringBuilder(128);
            GetClassName(x, buffer, buffer.Capacity);
            return buffer.ToString() == "Button";
        })
        .ToList();
}
1
katma
BUTTON olmadığından emin misin? Her halükarda, bugünlerde butonlara benzer butonların çoğunun BUTON pencereleri olmadığını söyleyebilirim.
katma yazar David Heffernan, kaynak
msdn.microsoft’a göre .com/tr-us/library/windows/desktop/& hellip; ve spy ++ ile kısa bir test "Düğme". Tabii ki bu sadece düğmeler yerel olduğunda işe yarar, varsayılan win32 düğmeleri ...
katma yazar Marvin, kaynak
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName,int nMaxCount);

Sınıf adını "Düğme" ile karşılaştırın

0
katma
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName,int nMaxCount);

Sınıf adını "Düğme" ile karşılaştırın

0
katma