【发布时间】:2011-04-17 09:39:58
【问题描述】:
如何检查其他应用程序是否在 C++ MFC 中以全屏模式和最顶层模式运行? 如果媒体播放器或其他播放器正在运行,我只想禁用所有自动对话框(警告)。 (就像 Avast 中的静音/游戏模式。) 我怎么能这样做?
谢谢。
【问题讨论】:
标签: c++ mfc dialog fullscreen
如何检查其他应用程序是否在 C++ MFC 中以全屏模式和最顶层模式运行? 如果媒体播放器或其他播放器正在运行,我只想禁用所有自动对话框(警告)。 (就像 Avast 中的静音/游戏模式。) 我怎么能这样做?
谢谢。
【问题讨论】:
标签: c++ mfc dialog fullscreen
在我看来,进步很小
bool AreSameRECT (RECT& lhs, RECT& rhs){
return (lhs.bottom == rhs.bottom && lhs.left == lhs.left && lhs.right == rhs.right && lhs.top == rhs.top) ? true : false;
}
bool IsFullscreenAndMaximized(HWND hWnd)
{
RECT screen_bounds;
GetWindowRect(GetDesktopWindow(), &screen_bounds);
RECT app_bounds;
GetWindowRect(hWnd, &app_bounds);
if(hWnd != GetDesktopWindow() && hWnd != GetShellWindow()) {
return AreSameRECT(app_bounds, screen_bounds);
}
return false;
}
感谢私下的回答
BOOL CALLBACK CheckFullScreenMode ( HWND hwnd, LPARAM lParam )
{
if( IsFullscreenAndMaximized(GetForegroundWindow()) )
{
* (bool*) lParam = true;
std::cout << "true";
return FALSE;
}
return TRUE;
}
int main() {
bool bThereIsAFullscreenWin = false;
EnumWindows( (WNDENUMPROC) CheckFullScreenMode, (LPARAM) &bThereIsAFullscreenWin );
}
【讨论】:
使用 EnumWindows、GetWindowInfo 和 GetWindowRect 的组合可以解决问题。
bool IsTopMost( HWND hwnd )
{
WINDOWINFO info;
GetWindowInfo( hwnd, &info );
return ( info.dwExStyle & WS_EX_TOPMOST ) ? true : false;
}
bool IsFullScreenSize( HWND hwnd, const int cx, const int cy )
{
RECT r;
::GetWindowRect( hwnd, &r );
return r.right - r.left == cx && r.bottom - r.top == cy;
}
bool IsFullscreenAndMaximized( HWND hwnd )
{
if( IsTopMost( hwnd ) )
{
const int cx = GetSystemMetrics( SM_CXSCREEN );
const int cy = GetSystemMetrics( SM_CYSCREEN );
if( IsFullScreenSize( hwnd, cx, cy ) )
return true;
}
return false;
}
BOOL CALLBACK CheckMaximized( HWND hwnd, LPARAM lParam )
{
if( IsFullscreenAndMaximized( hwnd ) )
{
* (bool*) lParam = true;
return FALSE; //there can be only one so quit here
}
return TRUE;
}
bool bThereIsAFullscreenWin = false;
EnumWindows( (WNDENUMPROC) CheckMaximized, (LPARAM) &bThereIsAFullscreenWin );
edit2:使用经过测试的代码进行了更新,在 Windows 7 上的 MediaPlayer 中运行良好。我尝试使用 GetForeGroundWindow 而不是 EnumWindows,但随后 IsFullScreenSize() 检查仅根据鼠标所在的媒体播放器区域起作用.
请注意,下面评论中提到的多显示器设置问题仍然存在。
【讨论】: