Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2011, 09:45   #1
sysyman
Пользователь Подтвердите свой е-майл
 
Аватар для sysyman
 
Регистрация: 04.07.2007
Сообщений: 75
По умолчанию Не сворачивается окно.

Здравствуйте. Столкнулся я с проблемой, которую не могу решить сам, нужна помощь зала. Суть вот в чем. В нужный момент моя программа показывает сообщение которое пользователь должен увидеть в любом варианте. Сообщение посылаю так:
Код:
Application.MessageBox(PANSIChar('Текст моего сообщения') ,Pchar('Внимание'),MB_OK+MB_ICONWARNING+MB_SYSTEMMODAL+MB_TOPMOST+MB_SETFOREGROUND);
Начал я тестировать показ сообщения в момент когда пользователь играет в компьютерную игру.В момент показа сообщения окно игры просто автоматически сворачивалось на панель задач.То есть все отлично.Но вот я добрался до игры Xenus. Окно этой игры не сворачивалось во время показа сообщения. Ну думаю сверну тогда я сам это окно. Пробывал сворачивать, скрывать, сдвигать окно за пределы экран, менять размеры. Функции отвечают, что все получается, но визуально окно остается на месте, местами проскакивают мигая окна , которые лежат ниже и даже можно играть дальше, пока не выйдешь в меню игры кнопкой Esc, после этого окно зависает и остается мне только перезагружать комп. При вызове диспетчера задач он тоже не выводится выше этой формы, он просто раз мигнет и все. Форма сворачивается если программно заблокировать систему, то есть выйти на экран выбора пользователей.Тогда после входа в систему она оказывается свернутой, но через 1-2 секунды сама автоматом разворачивается на весь экран. Кто может объяснить почему так происходит? Ниже приведу код и полученный лог-файл.
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin

if Timer1.Tag=0 then
begin
wnd:=GetForeGroundWindow;//Показывает верхнее окно системы.(его идентификатор)
Memo1.Lines.Add('Окно - '+inttostr(wnd));
if IsWindowVisible(wnd) then//если окно видимое
Memo1.Lines.Add('Видимое') else
Memo1.Lines.Add('НЕВидимое') ;
Memo1.Lines.Add('');
Memo1.Lines.Add('Размеры окна');

GetWindowRect(wnd, r); //получим размеры окна
Memo1.Lines.Add('r.Left='+inttostr(r.Left));
Memo1.Lines.Add('r.Top='+inttostr(r.Top));
Memo1.Lines.Add('r.Right='+inttostr(r.Right));
Memo1.Lines.Add('r.Bottom='+inttostr(r.Bottom));
Memo1.Lines.Add('');
Memo1.Lines.Add('Установим новые размеры окна');

SetWindowPos(wnd,HWND_BOTTOM,0,0,100,100,SWP_NOACTIVATE ); //or SWP_NOCOPYBITS 
sleep(2000);
Memo1.Lines.Add('');
Memo1.Lines.Add('Размеры окна');

GetWindowRect(wnd, r); //получим размеры окна
Memo1.Lines.Add('r.Left='+inttostr(r.Left));
Memo1.Lines.Add('r.Top='+inttostr(r.Top));
Memo1.Lines.Add('r.Right='+inttostr(r.Right));
Memo1.Lines.Add('r.Bottom='+inttostr(r.Bottom));
Memo1.Lines.Add('');

Memo1.Lines.Add('Установим новые размеры окна,переместим за экран');

SetWindowPos(wnd,HWND_BOTTOM,1200,0,0,0,SWP_NOACTIVATE ); //or SWP_NOCOPYBITS 

sleep(2000);
Memo1.Lines.Add('');
Memo1.Lines.Add('Размеры окна');

GetWindowRect(wnd, r); //получим размеры окна
Memo1.Lines.Add('r.Left='+inttostr(r.Left));
Memo1.Lines.Add('r.Top='+inttostr(r.Top));
Memo1.Lines.Add('r.Right='+inttostr(r.Right));
Memo1.Lines.Add('r.Bottom='+inttostr(r.Bottom));
Memo1.Lines.Add('');

Memo1.Lines.Add('Делаем окно не видимым');
Memo1.Lines.Add('');
ShowWindow(wnd,SW_HIDE);
sleep(2000);
if IsWindowVisible(wnd) then//если окно видимое
Memo1.Lines.Add('Видимое') else
Memo1.Lines.Add('НЕВидимое');
Memo1.Lines.Add('');

Memo1.Lines.Add('Делаем окно видимым');
Memo1.Lines.Add('');

ShowWindow(wnd,SW_SHOW);

sleep(2000);
if IsWindowVisible(wnd) then//если окно видимое
Memo1.Lines.Add('Видимое') else
Memo1.Lines.Add('НЕВидимое');
Memo1.Lines.Add('');

Memo1.Lines.Add('Установим новые размеры окна,переместим его обратно на экран');

SetWindowPos(wnd,HWND_BOTTOM,0,0,100,100,SWP_NOACTIVATE ); //or SWP_NOCOPYBITS
sleep(1000);
Memo1.Lines.Add('');
Memo1.Lines.Add('Размеры окна');

GetWindowRect(wnd, r); //получим размеры окна
Memo1.Lines.Add('r.Left='+inttostr(r.Left));
Memo1.Lines.Add('r.Top='+inttostr(r.Top));
Memo1.Lines.Add('r.Right='+inttostr(r.Right));
Memo1.Lines.Add('r.Bottom='+inttostr(r.Bottom));
Memo1.Lines.Add('');

Memo1.Lines.Add('Минимизируем окно');

ShowWindow(wnd,SW_MINIMIZE);

sleep(2000);
if IsIconic(wnd) then
Memo1.Lines.Add('Минимизировано') else
Memo1.Lines.Add('НЕ Минимизировано') ;
Memo1.Lines.Add('');
Memo1.Lines.Add('Проверим на видимость');
if IsWindowVisible(wnd) then//если окно видимое
Memo1.Lines.Add('Видимое') else
Memo1.Lines.Add('НЕВидимое') ;
sleep(5000);
Memo1.Lines.Add('');
Memo1.Lines.Add('Размеры окна');

GetWindowRect(wnd, r); //получим размеры окна
Memo1.Lines.Add('r.Left='+inttostr(r.Left));
Memo1.Lines.Add('r.Top='+inttostr(r.Top));
Memo1.Lines.Add('r.Right='+inttostr(r.Right));
Memo1.Lines.Add('r.Bottom='+inttostr(r.Bottom));
Memo1.Lines.Add('');

Memo1.Lines.Add('Проверим какое окно самое верхнее');
wnd:=GetForeGroundWindow;
Memo1.Lines.Add('Окно - '+inttostr(wnd));

Memo1.Lines.SaveToFile('E:\log.txt');
//PostMessage(wnd, WM_SYSCOMMAND,WM_PAINT,0);
end;

Timer1.Tag:=1;
end;
Вложения
Тип файла: txt log.txt (704 байт, 148 просмотров)
sysyman вне форума Ответить с цитированием
Старый 23.11.2011, 11:37   #2
SovereignSun
Форумчанин
 
Регистрация: 22.11.2011
Сообщений: 127
По умолчанию

А если Handle сделать Windows кнопки "Свернуть все окна"?
SovereignSun вне форума Ответить с цитированием
Старый 23.11.2011, 11:40   #3
SovereignSun
Форумчанин
 
Регистрация: 22.11.2011
Сообщений: 127
По умолчанию

function EnumMiniProc (Wd: HWnd; Param: LongInt): Boolean; stdcall; // Обязательно stdcall !!!
Begin
If Wd<>Form1.Handle then // если это не наша программа
If IsWindowVisible(WD) then // если окно видимо
If not IsIconic(WD) then // если окно не свернуто
If isWindow(WD) then // и вообще это - окно.
ShowWindow(WD, SW_MINIMIZE); // свернем его.
EnumProc := TRUE; // продолжаем перебирать все окна системы.
end;

или

procedure MinimizeAllApp;
VAR
Wnd : hWnd;
buff: ARRAY [0..127] OF Char;
begin
Wnd := GetWindow(MainForm.Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO BEGIN {Не показываем:}
IF (Wnd <> Application.Handle) AND {-Собственное окно}
IsWindowVisible(Wnd) AND {-Невидимые окна}
(GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0) {-Окна без заголовков}
THEN BEGIN
{тут во и пишешь:}
PostMessage(wnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
{или что-то вроде этого}
END;
Wnd := GetWindow(Wnd, gw_hWndNext);
END;
end;
SovereignSun вне форума Ответить с цитированием
Старый 23.11.2011, 20:34   #4
sysyman
Пользователь Подтвердите свой е-майл
 
Аватар для sysyman
 
Регистрация: 04.07.2007
Сообщений: 75
По умолчанию

Свернул все окна процедурой MinimizeAllApp. Интересный эффект получился. Окно свернулось на 1 секунду и сразу автоматически восстановилось, после чего оказалось зависшим и на весь экран. Пришлось жать на резет. Такое ощущение что у этой игру какой то поток следит за состоянием этого окна и когда я его пытаюсь свернуть, то этот поток его разворачивает. Но почему так бездарно! Окно зависает. Кстати, если посылать сообщения только этому одному окну, то оно не сворачивается даже на 1 секунду, а вот если сворачивать все окна в системе, то сворачивается. В чем может быть дело? Может есть какие-нибудь соображения?
sysyman вне форума Ответить с цитированием
Старый 24.11.2011, 14:31   #5
SovereignSun
Форумчанин
 
Регистрация: 22.11.2011
Сообщений: 127
По умолчанию

А сама по себе сварачивается?
SovereignSun вне форума Ответить с цитированием
Старый 24.11.2011, 22:17   #6
sysyman
Пользователь Подтвердите свой е-майл
 
Аватар для sysyman
 
Регистрация: 04.07.2007
Сообщений: 75
По умолчанию

Нет, сама эта форма не сворачивается, если только не нажму выйти из игры, тогда она просто закрывается.
sysyman вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Треугольное окно со сторонами A, B, C. Проверить, пройдёт ли в окно коробка цилиндрической формы (D и H) (паскаль) ihimaru Помощь студентам 5 02.10.2011 22:11
Не сворачивается firephenix Помощь студентам 2 28.02.2011 08:59
[?] Послать клавишу в чужое окно, не выводя окно на передний план. Moriarty Win Api 4 21.02.2011 05:11
Не сворачивается форма John_chek Общие вопросы Delphi 2 30.10.2009 11:43
«Окно+символ». Создать класс, представляющий окно в текстовом режиме. RustreX Паскаль, Turbo Pascal, PascalABC.NET 1 11.11.2007 19:28