Короче говоря, я пытаюсь добавить некоторые функциональные возможности в пользовательский модуль обновления, работающий в качестве службы Windows. Я столкнулся с некоторыми проблемами, когда приложение, которое я пытаюсь обновить, потенциально может быть запущено, и мне нужно выполнить некоторые пользовательские действия, если оно есть.
У меня проблема в том, что API-вызов EnumDesktopWindows возвращает только процессы, запущенные в контексте локальной системы.
Теперь это в основном имеет смысл для меня относительно того, почему это было сделано, и так далее (я думаю - хотя я был бы признателен за дальнейшие объяснения).
Однако как же тогда выполнить эту функцию через службу?
Это основы кода, который я использую:
public static IntPtr[] EnumDesktopWindows()
{
WinAPI._desktopWindowHandles = new List<IntPtr>();
WinAPI.EnumDelegate enumfunc = new WinAPI.EnumDelegate(EnumWindowsCallBack);
IntPtr hDesktop = IntPtr.Zero; // current desktop
bool success = WinAPI.EnumDesktopWindows(hDesktop, enumfunc, IntPtr.Zero);
if (success)
{
IntPtr[] handles = new IntPtr[_desktopWindowHandles.Count];
_desktopWindowHandles.CopyTo(handles);
return handles;
}
else
{
int errorCode = Marshal.GetLastWin32Error();
string errorMessage = String.Format("EnumDesktopWindows failed with code {0}.", errorCode);
throw new Exception(errorMessage);
}
}
Может быть, у меня все это неправильно, и проблема в линии?:
IntPtr hDesktop = IntPtr.Zero;