Здравствуйте, <Аноним>, Вы писали:
А> ShowWindow(Wnd,SW_SHOWDEFAULT)
Попробуй SetForegroundWindow(Wnd)
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
А>Идейно, этот кусок должен запрещать повторный вызов из текущей программы внешнего приложения 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.