【发布时间】:2010-03-17 09:46:00
【问题描述】:
当在控制台应用程序中使用以下类并至少运行一个记事本实例时,GetWindowThreadProcessId 正确返回非零线程 ID。但是,如果 Windows 服务中包含相同的代码,GetWindowThreadProcessId 总是返回 0 并且不会引发异常。将启动服务的用户更改为与运行控制台应用程序的用户相同并不会改变结果。是什么导致GetWindowThreadProcessId 返回0,即使它提供了有效的hwnd?为什么它在控制台应用程序和服务中的功能不同?注意:我正在运行 Windows 7 32 位并针对 .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()
{
...
}
}
【问题讨论】: