前端时间开发的window的服务,怎么都不能访问windows的窗口,经过查看资料,最后才总算解决。在WINDOWS服务中定时检测异常窗口,如果发现异常窗口关闭,并且自动开启一个程序,向新开启的窗口的文本框自动填充内容,并自动点击登录按钮登录。一下是访问窗口资源的代码,下一篇将介绍如何访问另外一个进程的窗口,并且自动填充文本的内容并且点击确认按钮:
下面是如何在服务中访问窗口的代码:该代码已经测试通过
char ExePath[MAX_PATH];
memset(ExePath, 0, sizeof(ExePath));
DWORD dwLen = ::GetModuleFileName(NULL, ExePath, sizeof(ExePath));
if (dwLen >= 0){
::PathRemoveFileSpec(ExePath);
}
//
char fullPath[MAX_PATH];
sprintf(fullPath,"%s\\checkV5Bill.exe",ExePath);
DWORD sleepTime = 1000 * 2 * 60;
HDESK hdeskCurrent;
HDESK hdesk;
HWINSTA hwinstaCurrent;
HWINSTA hwinsta;
hwinstaCurrent = GetProcessWindowStation();
if (hwinstaCurrent == NULL){
return ;
}
hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
if (hdeskCurrent == NULL){
return ;
}
//打开用户的winsta0
hwinsta = OpenWindowStation("winsta0", FALSE,
WINSTA_ACCESSCLIPBOARD |
WINSTA_ACCESSGLOBALATOMS |
WINSTA_CREATEDESKTOP |
WINSTA_ENUMDESKTOPS |
WINSTA_ENUMERATE |
WINSTA_EXITWINDOWS |
WINSTA_READATTRIBUTES |
WINSTA_READSCREEN |
WINSTA_WRITEATTRIBUTES);
if (hwinsta == NULL){
return ;
}
if (!SetProcessWindowStation(hwinsta)){
return ;
}
//打开desktop
hdesk = OpenDesktop("default", 0, FALSE,
DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE |
DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALPLAYBACK |
DESKTOP_JOURNALRECORD |
DESKTOP_READOBJECTS |
DESKTOP_SWITCHDESKTOP |
DESKTOP_WRITEOBJECTS);
if (hdesk == NULL){
return;
}
SetThreadDesktop(hdesk);
//检测WINDOWS中是否有标题为"Microsoft Visual C++ Debug Library"的窗口,如果有,自动关闭
char *m_erroWindowName = "Microsoft Visual C++ Debug Library";
while(true){
char* errorWinName =m_erroWindowName;
HWND hwnd=::FindWindow(NULL,errorWinName); //隐藏"ddd"窗口
if(hwnd==NULL)
{
break;
}
Sleep(2);
//ID = 3
::SendMessage(hwnd,WM_COMMAND,MAKEWPARAM(3,BN_CLICKED),NULL);
}
// 自动运行一个外部程序fullPath,其工作路径为ExePath。
DebugMsg("My service is sleeping (%lu)...", m_iState);
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = fullPath;
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = ExePath;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
Sleep(sleepTime);
//
SetProcessWindowStation(hwinstaCurrent);
SetThreadDesktop(hdeskCurrent);
CloseWindowStation(hwinsta);
CloseDesktop(hdesk);