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
}哥们三天两夜没睡好了,就为了折腾这个监控,麻烦兄弟们帮我看看问题出在哪里,分不在话下
// ...
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
}哥们三天两夜没睡好了,就为了折腾这个监控,麻烦兄弟们帮我看看问题出在哪里,分不在话下
写成这样看看:LRESULT CALLBACK EnumWindowsProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
http://msdn.microsoft.com/en-us/library/bb756986.aspx
谢谢帮助,关于桌面交互方面已经搞定,能操作窗体,我想问enumwindows为什么不行
出错了还倒好,编译运行都没问题,独独这个回调进不去,跟没定义他一样,enumwindows本身的返回值倒是看了,正常,不过异步调用的返回值没有实际意义
前段时间看过这方面,不够深入,还得谢谢你提醒,我又看了一遍,问题就出在这里。当时我只做了一个允许桌面交互的脚本,没想到允许交互之后还是会隔断,session0太安全了,这样的话我考虑用进程间通信可能会起作用,那么sessionX可能也要加client,我再测一下,谢谢你,给分结帖