如何将鼠标悬停在最小化,最大化和关闭按钮上?

时间:2015-07-25 19:25:07

标签: delphi vcl windows-10 delphi-xe6

在Delphi应用程序中,当您将鼠标悬停在边框图标上时,例如:

  • 最小化
  • 最大化
  • 恢复

它的行为不正确:

enter image description here

与行为正确的应用程序进行比较:

enter image description here

重现步骤

  1. 点击文件 VCL表单应用程序 - Delphi
  2. 点击运行(F9)
  3. 将鼠标悬停在最小化,最大化或关闭按钮上。
  4. 如何解决?

    • Windows 10,64位(在台式机上本机运行)
    • Delphi XE6

    编辑 - Delphi 7也失败了:

    enter image description here

    在Delphi 5中:

    enter image description here

    在Delphi 4中:

    enter image description here

    我假设(即害怕)它是由ThemeServices引擎引起的;他们可能认为不尊重用户的偏好是很酷的。但看起来它更具基础性。

    兼容模式

    • :失败
    • Windows 8 :失败
    • Windows 7 :失败
    • Windows Vista(Service Pack 2):失败
    • Windows Vista(Service Pack 2):失败
    • Windows Vista :失败
    • Windows XP(Service Pack 3)(禁用非客户区域主题):正常工作
    • Windows XP(Service Pack 2)(禁用非客户区域主题):正常工作
    • Windows 98 / Windows Me (禁用非客户区域主题):正常工作
    • Windows 95 (禁用非客户区域主题):正常工作

    的Skype

    Skype也失败了;也用Delphi编写:

    enter image description here

    高DPI是触发器

    我终于找到了为什么它在我使用过的每台Windows 10机器上都失败了;但不适合所有人。高dpi。

    将dpi设置为97(101%)或更高。

    关闭够了

    Dalija的解决方案有效:

    enter image description here

    我们会忽略工具提示中的问题,并且活到另一天。

    还应注意,Windows 10将建议您在更改DPI后可能必须注销并重新登录才能使某些应用程序正常工作。德尔福绝对是这样。

    还应该注意的是,德尔福并不像这样容忍DPI背后的变化。这包括调整 zoom 滑块。这还包括将应用程序放在除主显示器之外的任何显示器上。

    我们从未弄清楚问题是什么;对于运行多个显示器的用户来说,它只是踢了它。

    QC错误报告

    因为 Bor ... Impr ... CodeG ... Embarca ... Idera的QC网站是支付墙的背后,这里是{的副本{3}}

    如你所见:没有人关心。

1 个答案:

答案 0 :(得分:10)

高DPI是触发器,它会导致解决方案。

出现此问题的应用程序不支持高DPI。悬停问题的解决方案是通过使用1,2或3下的解决方案之一让他们了解或打开相关的兼容模式。

注意:打开高DPI感知时,其他应用程序是否会正常运行是另一个问题,因应用程序而异。

  1. 在兼容模式下,选中“在高DPI设置下禁用显示缩放”

  2. SetProcessDPIAware文件中调用.dpr作为第一次调用 - 如Ian Boyd所述,调用此函数可以使用竞争条件并且首选方法是使用清单。 SetProcessDPIAware

  3. 使用带有truetrue/PM设置的自定义清单(“启用运行时主题”中包含的默认Delphi清单不能识别DPI)

  4. 当前版本的Delphi VCL和FMX框架缺乏对每个监视器DPI感知的支持,因此只有在您自己处理每个监视器DPI时才使用true/PM清单。向QP报告为VCL and FireMonkey lack Per-Monitor DPI support for Windows 8.1 (and Windows 10)

      <asmv3:application>
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
          <dpiAware>true</dpiAware>
        </asmv3:windowsSettings>
      </asmv3:application>
    

      <asmv3:application>
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
          <dpiAware>true/PM</dpiAware>
        </asmv3:windowsSettings>
      </asmv3:application>
    

    <强>更新

    Delphi VCL是错误行为的来源,特别是问题出现在TForm类或其祖先的某个地方。使用直接Windows API时,导致Windows正常运行。

    行为正常的Windows API代码:

      MessageBox(0, 'Correct', 'Caption', MB_OK); 
    
      ShowMessage('Correct'); // if themes are enabled -> Windows Task dialog is used
    

    在不使用VCL的情况下创建主窗口的完整Delphi示例应用程序 - 行为正常

    program win;
    
    {$R *.res}
    
    uses
      Windows,
      Messages,
      SysUtils;
    
    var
      Msg: TMSG;
      LWndClass: TWndClass;
      hMainHandle: HWND;
    
    function WindowProc(HWND, Msg: Longint; wParam: wParam; lParam: lParam): Longint; stdcall;
    begin
      if Msg = WM_DESTROY then PostQuitMessage(0);
      Result := DefWindowProc(HWND, Msg, wParam, lParam);
    end;
    
    begin
      LWndClass.hInstance := hInstance;
      with LWndClass do
        begin
          lpszClassName := 'WinApiWnd';
          Style := CS_PARENTDC or CS_BYTEALIGNCLIENT;
          hIcon := LoadIcon(hInstance, 'MAINICON');
          lpfnWndProc := @WindowProc;
          hbrBackground := COLOR_BTNFACE + 1;
          hCursor := LoadCursor(0, IDC_ARROW);
        end;
    
      RegisterClass(LWndClass);
      hMainHandle := CreateWindow(LWndClass.lpszClassName, 'Window Title', WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU or WS_VISIBLE, 0, 0, 360, 200, 0, 0, hInstance, nil);
    
      while GetMessage(Msg, 0, 0, 0) do
        begin
          TranslateMessage(Msg);
          DispatchMessage(Msg);
        end;
    end.
    

    行为不端的VCL表格:

    var
      f: TForm;
    
      f := CreateMessageDialog('Broken', mtWarning, mbOKCancel, mbOk);
      f.ShowModal;
      f.Free;
    
      f := TForm.Create(nil);
      f.ShowModal;
      f.Free;