gpt4 book ai didi

c++ - 即使我获得类窗口的句柄,BringWindowToTop 也不起作用

转载 作者:可可西里 更新时间:2023-11-01 09:39:29 24 4
gpt4 key购买 nike

我正在通过以下方法注册我的类(class):

BOOL CNDSClientDlg::InitInstance()
{
//Register Window Updated on 16th Nov 2010, @Subhen
// Register our unique class name that we wish to use
WNDCLASS wndcls;
memset(&wndcls, 0, sizeof(WNDCLASS));

wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
wndcls.lpfnWndProc = ::DefWindowProc;
wndcls.hInstance = AfxGetInstanceHandle();
wndcls.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wndcls.lpszMenuName = NULL;

//Class name for using FindWindow later
wndcls.lpszClassName = _T("CNDSClientDlg");
// Register new class and exit if it fails

if(!AfxRegisterClass(&wndcls)) // [C]

{
return FALSE;
}
}

然后调用 InitInstance 方法并在类的构造函数中创建窗口:

CNDSClientDlg::CNDSClientDlg(CWnd* pParent /*=NULL*/)
: CDialog(CNDSClientDlg::IDD, pParent)

{
InitInstance();

HWND hWnd;
hInst = AfxGetInstanceHandle(); // Store instance handle in our global variable
hWnd = CreateWindow(_T("CNDSClientDlg"), "NDS", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL);


}

现在在我的其他应用程序中,我找到了窗口并试图将其置于顶部:

编辑可以用下面的代码带来新创建的窗口

 CWnd *pWndPrev = NULL;
CWnd *FirstChildhWnd = NULL;
pWndPrev = CWnd::FindWindow(_T("CNDSClientDlg"),NULL);
if(pWndPrev != NULL)
{
//pWndPrev->BringWindowToTop();
WINDOWPLACEMENT wndplacement;
pWndPrev->GetWindowPlacement(&wndplacement);
wndplacement.showCmd = SW_RESTORE;
pWndPrev->SetWindowPlacement(&wndplacement);
pWndPrev->SetForegroundWindow();

FirstChildhWnd = pWndPrev->GetLastActivePopup();
if (pWndPrev != FirstChildhWnd)
{
// a pop-up window is active, bring it to the top too
FirstChildhWnd->GetWindowPlacement(&wndplacement);
wndplacement.showCmd = SW_RESTORE;
FirstChildhWnd->SetWindowPlacement(&wndplacement);
FirstChildhWnd->SetForegroundWindow();
}

我能够找到窗口,因为 pWndPrev 不是 NULL,但它没有将我的应用程序调到最前面。我是否需要注册任何其他类而不是 CNDSClientDlg。我想将我的 MFC 应用程序置于顶部。

最佳答案

需要注意的几件事...

1) 尝试使用 SetForegroundWindow() 而不是 BringWindowToTop()。自从我完成 Win32 编程以来已经有一段时间了,但我似乎记得 BringWindowToTop() 有一些限制(尤其是在不同进程中处理窗口时)。

2) 从 Windows 2000 开始,Microsoft 就 SetForegroundWindow() 制定了一些规则。简短的版本是只有最前面的应用程序可以更改前景窗口。这个想法是,不是最前面的应用程序不能“跳到”事件应用程序的前面。如果后台应用程序调用 SetForegroundWindow(),Windows 将闪​​烁该应用程序的任务栏按钮,但实际上不会将该应用程序置于前台。用户必须这样做。我过于简化了规则,但这可能需要根据您的具体情况来考虑。

关于c++ - 即使我获得类窗口的句柄,BringWindowToTop 也不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4201728/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com