War*_* P 4 delphi winapi delphi-xe2
我有一个专为多个显示器设计的应用程序.它启动了,我们试图避免激活不需要激活的窗口,因为用户只在一个地方进行键盘输入,每次我们在辅助监视器上激活一个新表单时,它会抓住键盘焦点,这是我们的事情.希望避免.
我们的内部基础TForm类有一个这样的方法,它直接使用Win32 ShowWindow函数,避免了VCL框架的内部可见性变化系统,它抓住了焦点:
procedure TOurForm.ShowWithoutActivate;
begin
ShowWindow(Self.Handle, SW_SHOWNOACTIVATE);
Self.Visible := true;
end;
Run Code Online (Sandbox Code Playgroud)
如果我这样做,它会抓住焦点:
Self.Visible := true; // TWindow.Visible = true, will grab focus, plus make window visible.
Run Code Online (Sandbox Code Playgroud)
这是有效的,但我希望能够做的下一件事是设置最大化状态,以便表单在当前打开的监视器上最大化.我们如何将它放到特定的显示器上?通过修改Form的Left和Top属性,它始终以相同的方式工作.我们必须注意,如果我们在表单上存储Left/Top/Width/Height,然后将其恢复,那么当我们重新加载它时结果仍然有效.那不是我要问的.
我现在特别询问如何使用上面的自定义函数"显示"它来最大化表单.一个黑客攻击另一个黑客.这是我走过这个兔子洞的距离:
是否有可能使这个表单可见并使其处于我希望它不需要激活的窗口状态?如果我不能这样做,那么当我在辅助监视器上显示此表单时,用户将失去键盘焦点,这是我真正想要避免的.
我尝试使用Win32 ShowWindowAPI执行以下操作SW_SHOWMAXIMIZED:
ShowWindow(Self.Handle, SW_SHOWMAXIMIZED);
Run Code Online (Sandbox Code Playgroud)
以上似乎抓住焦点(激活).
创建顶级窗口时,将扩展窗口样式设置为
WS_EX_NOACTIVATE | WS_EX_APPWINDOW
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
为C++道歉.这应该很容易转换成Delphi.
| 归档时间: |
|
| 查看次数: |
602 次 |
| 最近记录: |