delphi – 如何使表单可见并最大化它以填充辅助监视器而不激活它
我有一个专为多个显示器设计的应用程序.它启动了,我们试图避免激活不需要激活的窗口,因为用户只在一个地方进行键盘输入,每次我们在辅助监视器上激活一个新表单时,它会抓住键盘焦点,这是我们的事情.希望避免.
我们的内部基础TForm类有一个这样的方法,它直接使用Win32 ShowWindow函数,避免了VCL框架的内部可见性变化系统,它抓住了焦点: procedure TOurForm.ShowWithoutActivate; begin ShowWindow(Self.Handle,SW_SHOWNOACTIVATE); Self.Visible := true; end; 如果我这样做,它会抓住焦点: Self.Visible := true; // TWindow.Visible = true,will grab focus,plus make window visible. 这是有效的,但我希望能够做的下一件事是设置最大化状态,以便 我现在特别询问如何使用上面的自定义函数“显示”它来最大化表单.一个黑客攻击另一个黑客.这是我走过这个兔子洞的距离: >当TForm(也是TWinControl的私有字段FShowing)为假时,设置Form.Maximized无效. 是否有可能使这个表单可见并使其处于我希望它不需要激活的窗口状态?如果我不能这样做,那么当我在辅助监视器上显示此表单时,用户将失去键盘焦点,这是我真正想要避免的. 我尝试使用Win32 ShowWindow API来做SW_SHOWMAXIMIZED: ShowWindow(Self.Handle,SW_SHOWMAXIMIZED); 以上似乎抓住焦点(激活). 解决方法
创建顶级窗口时,将扩展窗口样式设置为
WS_EX_NOACTIVATE | WS_EX_APPWINDOW WS_EX_NOACTIVATE停止激活窗口.这也使它从任务栏中消失,因此您需要WS_EX_APPWINDOW来解决该问题. 调用ShowWindow(hWnd,SW_MAXIMIZE),窗口将最大化但不会激活. 您需要能够在窗口可见时激活窗口,因此在WM_ACTIVATE处理程序(具有讽刺意味!)中,您需要清除WS_EX_NOACTIVATE标志: case WM_ACTIVATE: { DWORD exstyle = GetWindowLong(hWnd,GWL_EXSTYLE); if (exstyle & WS_EX_NOACTIVATE) { SetWindowLong(hWnd,GWL_EXSTYLE,exstyle & ~(DWORD)WS_EX_NOACTIVATE); } } 为C道歉.这应该很容易转换成Delphi. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |