Olá pessoal, vamos a este artigo onde vou mostrar um simples modo de listar as janelas que estão abertas no Windows.

Crie um projeto com um nome qualquer, feito isso insira na tela, um componente, ListView e um Buttonno listView mude a propriedade View para List, a tela irá ficar da seguinte maneira:

img

Agora logo acima do construtor do formulário adiciona o seguinte código:


private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr data);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr data);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool IsWindowVisible(IntPtr hWnd);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int GetWindowLong(IntPtr hWnd, int index);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int GetDesktopWindow();

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern uint SendMessageTimeout(IntPtr hWnd, uint Msg, int countOfChars, 
    StringBuilder text,
        uint pflag, uint uTImeoutj, out IntPtr result);
Nota: Esses métodos são nativos do Windows

Agora logo após o construtor, insira o seguinte método:


private bool EnumProc(IntPtr hWnd, IntPtr data)
{
    if (IsWindowVisible(hWnd) &&
       ((GetWindowLong(hWnd, -8) == 0) || (GetWindowLong(hWnd, -8) == GetDesktopWindow())) &&
       ((GetWindowLong(hWnd, -20) & 0x80) == 0))
    {
        StringBuilder sb = new StringBuilder();
        IntPtr res = IntPtr.Zero;

        SendMessageTimeout(hWnd, 0x000D, 256, sb, 0x0, 500, out res);

        listView1.Items.Add(sb.ToString());
    }
    return true;
}

No evento Click do botão insira o código abaixo :


EnumWindows(new EnumWindowsProc(EnumProc), IntPtr.Zero);

Feito isso, o projeto esta pronto :

img

Fico por aqui e até a próxima, espero que gostem do artigo.