在C#Windows服务上使用EnumWindowsProc

时间:2015-02-08 01:29:58

标签: c# service

我已在具有管理员权限帐户的Windows服务中写入此代码:

private delegate bool EnumWindowsProc(IntPtr hWnd, int lParam);
[DllImport("USER32.DLL")]
static extern bool EnumWindows(EnumWindowsProc enumFunc, int lParam);
[DllImport("USER32.DLL")]
static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int MaxCount);
[DllImport("USER32.DLL")]
static extern int GetWindowTextLength(IntPtr hWnd);
[DllImport("USER32.DLL")]
static extern bool IsWindowVisible(IntPtr hWnd);
[DllImport("USER32.DLL")]
static extern IntPtr GetShellWindow();

private static IntPtr shellWindow = GetShellWindow();
private static Dictionary<intptr, string=""> windows = new Dictionary<intptr, string="">();

private static bool _fEnumWindowsCallBack(IntPtr hWnd, int lParam)
{
    // It never execute this code
    if (hWnd == shellWindow) return true;
    if (!IsWindowVisible(hWnd)) return true;
    int length = GetWindowTextLength(hWnd);
    if (length == 0) return true;
    StringBuilder builder = new StringBuilder(length);
    GetWindowText(hWnd, builder, length + 1);
    windows[hWnd] = builder.ToString();
    return true;
}

public static IDictionary<intptr, string=""> GetOpenWindows()
{
    windows.Clear();
    EnumWindowsProc fEnumWindowsCallBack = new  EnumWindowsProc(_fEnumWindowsCallBack);
    EnumWindows(fEnumWindowsCallBack, 0);
    return windows;
}

但它确实有效(从不执行_fEnumWindowsCallBack函数)。

知道为什么吗?

我正在使用W7 x64,Visual Studio 2012。

感谢。

1 个答案:

答案 0 :(得分:0)

我的假设是因为您的Windows服务未在交互式会话中运行。没有窗户可以计算。

来自docs(强调我的):

  

支持的最低客户端

     

Windows 2000 Professional [仅限桌面应用]

     

支持的最低服务器

     

Windows 2000 Server [仅限桌面应用]