我使用GetProcessID意外地从应用程序中删除了Win2K兼容性.
我像这样使用它来获取已启动应用程序的主要HWND.
ShellExecuteEx(&info); // Launch application HANDLE han = info.hProcess; // Get process cbinfo.han = han; //Call EnumWindows to enumerate windows.... //with this as the callback static BOOL CALLBACK enumproc(HWND hwnd, LPARAM lParam) { DWORD id; GetWIndowThreadProcessID(hwnd, &id); if (id == GetProcessID(cbinfo.han)) setResult(hwnd) ... }
任何想法如何在Win2K上实现相同的功能?
有一种'不支持的'功能:ZwQueryInformationProcess():见
http://msdn.microsoft.com/en-us/library/ms687420.aspx
给定句柄,这将为您提供进程ID(以及其他内容).这不能保证适用于未来的Windows版本,因此我建议使用一个帮助函数来测试操作系统版本,然后使用GetProcAddress()为XP及更高版本调用GetProcessId(),并仅为Win2K调用ZwQueryInformationProcess() .
大卫K是对的.请参阅ZwQueryInformationProcess文档中的注释:
[ZwQueryInformationProcess可能会在Windows的未来版本中更改或不可用.应用程序应使用本主题中列出的备用功能.]
这意味着Microsoft可以选择在将来的任何时候删除它,从而破坏您的应用程序.我强烈认为你遵循DavidK的建议并在操作系统上使用不支持GetProcessID的ZwQueryInformationProcess,并在支持它的操作系统上使用GetProcessID(XP SP1及更高版本).