Как проверить, открыт ли экземпляр формы от дизайнера? - PullRequest
3 голосов
/ 20 июля 2011

Приложение Delphi проверяет, открыт ли экземпляр формы таким образом:

  form := FindWindow(PAnsiChar(FormClassName), nil);
  if form > 0 then
  begin
    SendMessage(form, WM_ACTIVATEAPP, 0, 0);
    Result := True;
  end else
    Result := False

Проблема в том, что когда форма открыта как окна Delphi Designer, она говорит, что форма открыта. Я просто потерял несколько рабочих часов, потому что когда я открыл форму и щелкнул, чтобы точки останова метод, приложение перестало работать :-(

Как сделать так, чтобы эта функция возвращала false, если экземпляр класса формы создан в Designer?


Ответ:
Приведенное ниже предложение opc0de привело меня к хорошему решению, поэтому я принимаю его комментарий в качестве ответа. Мне нужно было изменить код, чтобы перебрать все открытые формы. Вот окончательный вариант кода для счастья copy'n pasters of the world:

function VerifyFormIsOpen(formClass: String): Boolean;
var
  windowHndl, windowOld: HWND;
  processId: Cardinal;
begin
  windowOld := 0;
  windowHndl := 0;
  Result := False;
  repeat
    windowHndl :=  Windows.FindWindowEx(0, windowOld,
                                    PAnsiChar(formClass), nil);
    if (windowHndl > 0) then
    begin
      Windows.GetWindowThreadProcessId(windowHndl, processId);
      if processId = Windows.GetCurrentProcessId() then
      begin
        Windows.SendMessage(windowHndl, Messages.WM_ACTIVATEAPP, 0, 0);
        Result := True;
        break;
      end;
    end;
    windowOld := windowHndl;
  until windowHndl = 0;
end;

Ответы [ 2 ]

5 голосов
/ 20 июля 2011

Если вы делаете это так, что запускается только один экземпляр вашего приложения, сделайте это правильно: используйте Mutex.См. мой ответ на этот вопрос , чтобы узнать, как создать и использовать Mutex, или посмотрите принятый ответ на этот вопрос для реализации джедая.

Если вы можетеСоздайте Mutex, затем не ищите окно: даже если вы его найдете, оно либо из среды IDE, либо из другого приложения, которое, как оказалось, имеет то же имя.

3 голосов
/ 20 июля 2011

Используйте Getwindowthreadprocessid, чтобы получить идентификатор процесса окна, если этот идентификатор равен вашему процессу, что означает, что это действительное окно. Извините, я не могу опубликовать пример, но пишу со своего мобильного телефона

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...