Windows服务中 如何访问窗口

 

前端时间开发的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);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值