加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何使表单可见并最大化它以填充辅助监视器而不激活它

发布时间:2020-12-15 09:38:53 所属栏目:大数据 来源:网络整理
导读:我有一个专为多个显示器设计的应用程序.它启动了,我们试图避免激活不需要激活的窗口,因为用户只在一个地方进行键盘输入,每次我们在辅助监视器上激活一个新表单时,它会抓住键盘焦点,这是我们的事情.希望避免. 我们的内部基础TForm类有一个这样的方法,它直接使
我有一个专为多个显示器设计的应用程序.它启动了,我们试图避免激活不需要激活的窗口,因为用户只在一个地方进行键盘输入,每次我们在辅助监视器上激活一个新表单时,它会抓住键盘焦点,这是我们的事情.希望避免.

我们的内部基础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.

这是有效的,但我希望能够做的下一件事是设置最大化状态,以便
表格将在目前正在使用的监视器上最大化.我们如何将它放到特定的显示器上?通过修改Form的Left和Top属性,它始终以相同的方式工作.我们必须注意,如果我们在表单上存储Left / Top / Width / Height,然后将其恢复,那么当我们重新加载它时结果仍然有效.那不是我要问的.

我现在特别询问如何使用上面的自定义函数“显示”它来最大化表单.一个黑客攻击另一个黑客.这是我走过这个兔子洞的距离:

>当TForm(也是TWinControl的私有字段FShowing)为假时,设置Form.Maximized无效.
>当TForm的TWinControl.FShowing字段设置为true时,将windowState设置为wsMaximized也会导致表单激活.

是否有可能使这个表单可见并使其处于我希望它不需要激活的窗口状态?如果我不能这样做,那么当我在辅助监视器上显示此表单时,用户将失去键盘焦点,这是我真正想要避免的.

我尝试使用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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读