ShowWindow
От: Аноним  
Дата: 03.12.04 10:59
Оценка:
Имеет место следующий кусок текста:

var Wnd: THandle;
...
Wnd:=FindWindow(nil,'TextFile');
if Wnd=0 then
WinExec(PChar(CDir+'\TextMemo.exe'),SW_SHOWNORMAL)
else
ShowWindow(Wnd,SW_SHOWDEFAULT)

Идейно, этот кусок должен запрещать повторный вызов из текущей программы внешнего приложения TextMemo.exe, а если оно уже запущено — разворачивать его окно в исходное состояние.
В целом, все так и получается. Одно "но": если приложение TextMemo.exe было на момент вызова функции ShowWindow минимизировано, то оно сначала разворачивается, но потом перестает реагировать на кнопку минимизации ВООБЩЕ.
Не подскажите ли, в чем тут может быть дело? Заранее спасибо.
Re: ShowWindow
От: spyse  
Дата: 07.12.04 14:31
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А> ShowWindow(Wnd,SW_SHOWDEFAULT)


Попробуй SetForegroundWindow(Wnd)
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re: ShowWindow
От: wildwind Россия  
Дата: 07.12.04 14:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Идейно, этот кусок должен запрещать повторный вызов из текущей программы внешнего приложения TextMemo.exe, а если оно уже запущено — разворачивать его окно в исходное состояние.


Лучше запоминай хендл процесса или окна.
Re: ShowWindow
От: SergeyIT Россия  
Дата: 07.12.04 16:08
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Имеет место следующий кусок текста:


А>var Wnd: THandle;

А>...
А>Wnd:=FindWindow(nil,'TextFile');
А>if Wnd=0 then
А> WinExec(PChar(CDir+'\TextMemo.exe'),SW_SHOWNORMAL)
А>else
А> ShowWindow(Wnd,SW_SHOWDEFAULT)

А>Идейно, этот кусок должен запрещать повторный вызов из текущей программы внешнего приложения TextMemo.exe, а если оно уже запущено — разворачивать его окно в исходное состояние.

А>В целом, все так и получается. Одно "но": если приложение TextMemo.exe было на момент вызова функции ShowWindow минимизировано, то оно сначала разворачивается, но потом перестает реагировать на кнопку минимизации ВООБЩЕ.
А>Не подскажите ли, в чем тут может быть дело? Заранее спасибо.

Дело в том, что TextMemo.exe написано на Делфи
Извините, я все еще учусь
Re: ShowWindow
От: Arsu Россия  
Дата: 07.12.04 18:41
Оценка:
А>Идейно, этот кусок должен запрещать повторный вызов из текущей программы внешнего приложения TextMemo.exe, а если оно уже запущено — разворачивать его окно в исходное состояние.
А>В целом, все так и получается. Одно "но": если приложение TextMemo.exe было на момент вызова функции ShowWindow минимизировано, то оно сначала разворачивается, но потом перестает реагировать на кнопку минимизации ВООБЩЕ.
А>Не подскажите ли, в чем тут может быть дело? Заранее спасибо.


Где-то краем уха слышал про проблемы с FindWindow — зависает, что ли... Но сам не проверял.
А сам пользуюсь давным-давно откопанным кусочком кода неизвестного героя

program Project2;

uses
  Forms,
  windows,
  sysutils,
  messages,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}


var Wnd : hWnd;
    clss, buff, mainS: array [0..255] of Char;
    hMutex : integer = 0;
begin
  StrPCopy( mainS, '<что-то>');
  SetWindowText( Application.Handle,mainS);

  hMutex:=CreateMutex(nil,True,'{D3926C21-07DE-45EC-8AF2-A191C72E5574}'); // Создаем семафор
  if GetLastError <> 0
  then begin                             // Ошибка создания - значит уже создан
      GetClassName(Application.Handle, clss,sizeof(clss)); // Получаем имя класса
      Wnd := GetWindow(Application.Handle, GW_HWNDFIRST);  // Получаем ссылу на окно
      while Wnd <> 0 do
      begin
        if (Wnd<>Application.Handle)and(GetWindow(Wnd, GW_OWNER)=0)
        then begin                                         // Поиск по всем окнам
          GetClassName( Wnd, buff, sizeof(buff));          // Получаем класс окна
          if StrComp( buff, clss)=0
          then begin                                       // Сравниваем с нашим классом
            GetWindowText(Wnd, buff, sizeof(buff));        // Получаем текст найденного окна
            if StrComp(buff,mainS)=0
            then begin                                     // Сравниваем с нашим окно
              showwindow( Wnd, SW_RESTORE);    //восстановим, если свёрнуто
              SetForegroundWindow( Wnd);       //откопаем, если не свёрнуто :-)
            end;
          end;
        end;
        Wnd := GetWindow(Wnd, gw_HWNDNEXT); // Берем следующее
      end;
  end
  else begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;
  ReleaseMutex(hMutex);
  CloseHandle(hMutex);
end.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.