vs 2008环境下,建了一个ATL Service的工程,准备写一个windows服务程序,EnumWindows好像不工作,编译不报错,服务正常运行,可是死活进不了EnumWindowsProc回调函数处理,这是在WinUser.h中的定义,定时器的TIMERPROC也是这样定义的typedef VOID (CALLBACK* TIMERPROC)(HWND, UINT, UINT_PTR, DWORD);
// ...
typedef BOOL (CALLBACK* WNDENUMPROC)(HWND, LPARAM);
SetTimer都能工作,EnumWindows就是在TimerFunc中调用的,可是EnumWindowsProc怎么就不工作呢?
EnumWindowsProc定义如下,全局静态函数static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);class a
{
public:
    // 重写的 Run()中调用SetTimer
    HRESULT Run(int nShowCmd = 0)
    {
        // ...code
        SetTimer(NULL, NULL, 1000*10, (TIMERPROC)MyTimerProc);
    }    // ....code    // MyTimerProc中调用了EnumWindows
    static void CALLBACK MyTimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
    {
        // ...code        // 
        ::EnumWindows((WNDENUMPROC)EnumWindowsProc, (LPARAM)pInstance);
    }
};static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    // 进不到回调函数中来
    // ...code
}哥们三天两夜没睡好了,就为了折腾这个监控,麻烦兄弟们帮我看看问题出在哪里,分不在话下

解决方案 »

  1.   

    会不会是回调函数的格式(返回值、参数)不对呢?
    写成这样看看:LRESULT CALLBACK EnumWindowsProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
      

  2.   

    如果是Win Vista or later 考虑下Session 0 Isolation
    http://msdn.microsoft.com/en-us/library/bb756986.aspx
      

  3.   


    谢谢帮助,关于桌面交互方面已经搞定,能操作窗体,我想问enumwindows为什么不行
      

  4.   


    出错了还倒好,编译运行都没问题,独独这个回调进不去,跟没定义他一样,enumwindows本身的返回值倒是看了,正常,不过异步调用的返回值没有实际意义
      

  5.   

    不用Service状态,用普通用户权限运行,看看是不是有窗口枚举到了,如果是这样,那你就明白为什么服务下拿不到了
      

  6.   


    前段时间看过这方面,不够深入,还得谢谢你提醒,我又看了一遍,问题就出在这里。当时我只做了一个允许桌面交互的脚本,没想到允许交互之后还是会隔断,session0太安全了,这样的话我考虑用进程间通信可能会起作用,那么sessionX可能也要加client,我再测一下,谢谢你,给分结帖