Проблемы с настольным менеджером nVidia nView и приложениями Delphi? - PullRequest
3 голосов
/ 17 ноября 2009

Недавно я получил сообщение о проблеме с моими приложениями и диспетчером настольных компьютеров NVidia nView. По сути, nView, кажется, «скрывает» скрытые вторичные формы при перемещении приложения между мониторами. Я тестирую с Delphi 2010. Эту проблему также можно увидеть, используя только IDE (покажите не закрепленное окно, закройте его и затем выберите отправку Delphi IDE на другой монитор.) Ранее скрытые формы не отвечают. состояние и не может быть закрыто.

Воспроизвести:

. Используйте систему с несколькими мониторами вместе с настольным менеджером NVidia nView.
, Запустите любое приложение Delphi с дополнительными формами, которые будут скрыты при закрытии.
, Показать или ShowModal форму, затем закройте ее (форма должна быть показана хотя бы один раз).
, Выберите, чтобы отправить заявку на другой монитор. (с помощью горячих клавиш или значков надписей)
, Приложение переместится на другой монитор, и все скрытые формы будут видны.

Кто-нибудь еще видел эту проблему? Я проверил это с помощью более старой версии nView, но у клиента с последней версией возникает проблема, когда он пытается переместить основную форму или изменить ее размер. К сожалению, мой ноутбук не может быть обновлен до последней версии, поэтому я не могу легко протестировать его.

Спасибо за любые комментарии или предложения!

-Марк

1 Ответ

1 голос
/ 17 ноября 2009

У меня была такая же проблема. Приложение Delphi перестало отвечать без видимой причины. Глядя на трассировку стека от madExcept, я увидел, что приложение зависло в nview.dll. Единственное «решение», которое я нашел, - это поискать nView и посоветовать пользователю отключить его, используя следующий код:

function CheckForNview: Boolean;

  function IsNviewModuleRunning(AHandle: THandle; AProcessId: DWord): Boolean;
  var
    AModuleEntry: TModuleEntry32;
  begin
    AModuleEntry.dwSize := SizeOf(AModuleEntry);
    AModuleEntry.th32ProcessID := AProcessId;
    Result := False;

    if Module32First(AHandle, AModuleEntry) then
    begin
      if SameStr(AModuleEntry.szModule, 'nview.dll') then
        Result := True;
      while Module32Next(AHandle, AModuleEntry) do
      begin
        if SameStr(AModuleEntry.szModule, 'nview.dll') then
          Result := True;
      end;
    end;
  end;

var
  AHandle: THandle;
  AProcessEntry: TProcessEntry32;
begin
  Result := False;
  AHandle := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  if Process32First(AHandle, AProcessEntry) then
  begin
    if SameStr(AProcessEntry.szExeFile, ExtractFileName(ParamStr(0))) then
      Result := Result or IsNviewModuleRunning(AHandle, AProcessEntry.th32ProcessID);
    while Process32Next(AHandle, AProcessEntry) do
    begin
      if SameStr(AProcessEntry.szExeFile, ExtractFileName(ParamStr(0))) then
        Result := Result or IsNviewModuleRunning(AHandle, AProcessEntry.th32ProcessID);
    end;
  end;
...