2012-11-27 50 views
0

我試圖讓我的應用程序將焦點更改爲鼠標懸停發生的任何其他窗口。我試圖實現一些拖放功能,並且所有似乎缺少的功能都是隨着鼠標將我的應用程序移動到另一個應用程序而改變。將焦點轉移到另一個程序Windows API

這是我目前的測試功能(我做它WM_MOUSEMOVE在主回調prcedure現在的笑)

case WM_MOUSEMOVE: 
{ 
    POINT pt; 
    GetCursorPos(&pt); 
    HWND newHwnd = WindowFromPoint(pt); 

    if (newHwnd != g_hSelectedWindow) 
    { 
     cout << "changing windows" << endl; 
     cout << SetWindowPos(newHwnd, HWND_TOP, 0,0,0,0, SWP_NOMOVE|SWP_NOSIZE) << endl; 
     g_hSelectedWindow = newHwnd; 
    } 

    CallWindowProc(listproc, hwnd,message,wParam,lParam); 
    break; 
} 

我嘗試使用AllowSetForegroundWindow但它有助於在給定的範圍,它無法找到它,但我已包括在內。

任何幫助或建議,將不勝感激。

回答

1

AllowSetForegroundWindow不會幫助,除非其他窗口試圖通過調用SetForegroundWindow成爲前景窗口。

我很好奇,如果您需要將其他窗口放在前臺,爲什麼不直接撥打SetForegroundWindow呢?

更新:所以這就是你需要得到這個代碼工作的權利:

HWND ResolveWindow(HWND hWnd) 
{ /* Given a particular HWND, if it's a child, return the parent. Otherwise, if 
    * the window has an owner, return the owner. Otherwise, just return the window 
    */ 
    HWND hWndRet = NULL; 

    if(::GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD) 
     hWndRet = ::GetParent(hWnd); 

    if(hWndRet == NULL) 
     hWndRet = ::GetWindow(hWnd, GW_OWNER); 

    if(hWndRet != NULL) 
     return ResolveWindow(hWndRet); 

    return hWnd;  
} 

HWND GetTopLevelWindowFromPoint(POINT ptPoint) 
{ /* Return the top-level window associated with the window under the mouse 
    * pointer (or NULL) 
    */ 
    HWND hWnd = WindowFromPoint(ptPoint); 

    if(hWnd == NULL) 
     return hWnd;  

    return ResolveWindow(hWnd); 
} 

只需撥打GetTopLevelWindowFromPoint(pt)WM_MOUSEMOVE處理程序,如果你得到一個有效的HWND回來,那麼這將是一個頂層窗口,可以使用SetForegroundWindow將它帶到前臺。

我希望這會有所幫助。

+0

我也試過。沒有工作:( – user1853098

+0

你遇到的問題是,WindowFromPoint可能會返回一個窗口,不能成爲前景(即頂級窗口的子窗口)。我已經用一對函數更新了我的帖子,你可以使用。 –

+0

非常感謝,Nik!今天我會嘗試一下:D – user1853098

相關問題