Lors de l'utilisation de la classe suivante dans une application de console et de l'exécution d'au moins une instance du Bloc-notes, GetWindowThreadProcessId
renvoie correctement un ID de thread différent de zéro. Toutefois, si le même code est inclus dans un service Windows, GetWindowThreadProcessId
renvoie toujours 0
et aucune exception n'est levée. Changer l'utilisateur du lancement du service pour qu'il soit le même que celui qui exécute l'application console n'a pas modifié le résultat. Quelles sont les causes GetWindowThreadProcessId
pour renvoyer 0
même s'il est fourni avec un hwnd valide? Et pourquoi fonctionne-t-il différemment dans l'application console et le service? Note: Je cours sous Windows 7 32 bits et cible .NET 3.5.Pourquoi GetWindowThreadProcessId renvoie-t-il 0 lorsqu'il est appelé à partir d'un service?
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);
....
}
}
}
Code de la console:
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()
{
...
}
}
Merci pour la réponse détaillée. Une révision plus approfondie, c'est probablement une meilleure décision de conception pour exécuter mon code dans une application au lieu d'un service. – dcharles