При использовании следующего класса в консольном приложении и наличии хотя бы одного экземпляра Блокнота, GetWindowThreadProcessId
правильно возвращает ненулевой идентификатор потока. Однако, если один и тот же код включен в службу Windows, GetWindowThreadProcessId
всегда возвращает 0
, и исключений не выдается. Изменение пользователя, под которым запускается служба, таким же, как у пользователя, на котором запущено консольное приложение, не изменило результат. Что заставляет GetWindowThreadProcessId
возвращать 0
, даже если ему предоставлен действительный hwnd? И почему он работает по-разному в консольном приложении и сервисе? Примечание. Я использую 32-разрядную версию Windows 7 и нацеливаюсь на .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);
....
}
}
}
Код консоли:
class Program
{
static void Main(string[] args)
{
var testClass = new TestClass();
testClass.AttachToNotepad();
}
}
Сервисный код:
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()
{
...
}
}