2011-07-05 61 views
0

我正在使用服務中的GetForegroundWindow(),因爲我想監視窗口焦點,但由於交互式用戶問題,該函數在Windows 7上返回null。有什麼方法可以讓我的服務中的重點窗口?從Windows 7服務GetForegroundWindow

HWINSTA hWinStaUser = OpenWindowStation(_T("WinSta0"), FALSE, MAXIMUM_ALLOWED); 
    if (SetProcessWindowStation(hWinStaUser)) 
    { 
     /* -- Open user's desktop "Default". -- */ 
     HDESK hDeskUser = OpenInputDesktop(0,FALSE,MAXIMUM_ALLOWED); 
     //HDESK hDeskUser = OpenDesktop(_T("Default"), 0, FALSE, MAXIMUM_ALLOWED); 
     /* -- Set thread desktop to "Default". -- */ 
     if (SetThreadDesktop(hDeskUser)) 
     { 
      HWND hwndActiveWin = GetForegroundWindow(); 

      int idActive  = GetWindowThreadProcessId(hwndActiveWin, NULL); 
      if (AttachThreadInput(GetCurrentThreadId(), idActive, TRUE)) 
      { 
       HWND hwndFocused = GetFocus(); // focused control within the active window, i.e. focus throughout the screen 
       if(hwndFocused != NULL) 
       { 
        DWORD dwProcessID = 0;  
        GetWindowThreadProcessId(hwndFocused, &dwProcessID); 
        processPid = dwProcessID; 
       }    
       AttachThreadInput(GetCurrentThreadId(), idActive, FALSE);  
      }   
     } 

回答

5

您需要了解問題本身。服務無法與桌面交互,因爲存在安全風險,並且可能有許多桌面(許多登錄用戶)。 GetForegroundWindow()是與桌面的交互。沒有簡單的解決方法。複雜的一個涉及單獨的進程作爲Windows應用程序(而不是服務)運行並與您的服務進行通信。

+0

感謝亞歷克斯..所以你的意思是,如果我必須在Windows 7上實現這一點,我將不得不創建一個這樣做的過程,並與我的服務交互?有沒有辦法通過我可以得到活動桌面和那裏的窗戶? – Neha

+0

我想知道如何獲得窗口焦點在Windows 7中的桌面..我使用C++ ..這將是偉大的,如果你可以幫助我這個.. – Neha

+0

最簡單的方法是使用'GetForegroundWindow( )'。由於您無法在您的服務中使用它,因此您需要實現單獨的用戶模式應用程序,並使用某種進程間通信將此信息發送給您的服務。通過網絡套接字 –