Pourquoi ne GetWindowThreadProcessId retourner la valeur 0 lorsqu'il est appelé à partir d'un service?

Lors de l'utilisation de la classe suivante dans une application console, et ayant au moins une instance de bloc-notes en cours d'exécution, GetWindowThreadProcessId correctement renvoie une valeur non nulle id de thread. Toutefois, si le même code est inclus dans un Service Windows, GetWindowThreadProcessId retourne toujours 0 et aucune exception n'est levée. Changer l'utilisateur le lancement d'un service en vertu d'être le même que celui de l'exécution de l'application de la console de ne pas altérer le résultat. Quelles sont les causes de GetWindowThreadProcessId de retour 0 même si il est fourni avec une pièce d'hwnd? Et pourquoi est-elle fonctionner différemment dans l'application de console et le service? Note: je suis sous Windows 7 32-bit et de ciblage .NET 3.5.

public class TestClass
{
    [DllImport("user32.dll")]
    static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);

    public void AttachToNotepad()
    {
        var processesToAttachTo = Process.GetProcessesByName("Notepad")

        foreach (var process in processesToAttachTo)
        {
            var threadID = GetWindowThreadProcessId(process.MainWindowHandle, 
                IntPtr.Zero);

            ....
        }
    }
}

Console Code:

class Program
{
    static void Main(string[] args)
    {
        var testClass = new TestClass();

        testClass.AttachToNotepad();
    }
}

Code De Service:

public class TestService : ServiceBase
{
    private TestClass testClass = new TestClass();

    static void Main()
    {
        ServiceBase.Run(new TestService());
    }

    protected override void OnStart(string[] args)
    {
        testClass.AttachToNotepad();

        base.OnStart(args);
    }

    protected override void OnStop()
    {
        ...
    }
}

OriginalL'auteur dcharles | 2010-03-17