Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

[Delphi6] закрыть message box

Здравствуйте!
Очень важная проблема:
каким образом можно программно закрыть message box(окошко с
инофрмацией)?
То есть идея такова: например при нажатии на кнопку выскакивает это
сообщение, потом оно тут же закрывается, чтобы это было невидно
пользователю?
Вот код:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('Hello');
{что нужно вставить тут чтобы сообщение Hello тут же закрылось?}
end;
Заголовок этого message box известен.
Очень надеюсь на вашу помощь, так как вопрос и в самом деле очень
важный для меня.

Ответить   Wed, 10 Mar 2004 14:28:15 +0200 (#100238)

 

Ответы:

Доброго времени суток, keel.
Вы писали 10 марта 2004 г., 20:20:48
на тему "[Delphi6] закрыть message box"

procedure PressKey (key : integer);
begin
keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY,0);
keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('Hello');
PressKey (VK_ENTER);
end;

З.Ы. Сам не пробовал, по памяти писал. Если не будет работать, пиши.

* В мире нет вечных двигателей, зато есть вечные тормоза

Ответить   Денис Wed, 10 Mar 2004 20:23:29 +0300 (#100388)

 

Здравствуйте Денис,

Wednesday, March 10, 2004, 7:23:29 PM, вы писали:

Не получается у меня чего-то, пишет при PressKey (VK_ENTER); что мол
несоответствие переменных(
И это работать не будет в том смысле что PressKey (VK_ENTER);
выполнится только после того как message box будет закрыт.

Ответить   Thu, 11 Mar 2004 21:23:41 +0200 (#101045)

 

А ежели так:

Попробуй также с параметром KEYEVENTF_KEYUP.
Я следил за этой дискуссией и хочу сделать пару замечаний.
1. Тяжело представить такую ситуацию, когда сама программа должна сама
"погасить" свое же окно с информацией о внештатной ситуации - ведь
именно такая ситуация предпологает выдачу окна-мессидж. Если не
секрет, раскажи, зачем это надо? Может, твою проблему можно решить
более простым путем, без использования таких заморочек.
2. Насколько я в курсе, хендлы месидж-окон не находятся ни функцией
FindWindow (не знаю, как насчет других функций поиска хендлов), ни
WinSight-ом. Удивлен, как тебе удалось откопать его в WinSight-е.
Ты спрашивал, постоянно ли это значение. Ответ - нет, поскольку хендл
- это своего рода порядковый номер окна в ОС. Запусти другое
количество программ или даже в другом порядке, и ты увидешь, что
одному и тому же окну соответствуют разные значения его хендлов в
разных сеансах. То есть, жестко привязаться к одному числу нельзя.
Потому, я либо за пересмотр самой идеи закрытия своего же месидж-окна
(например, смастери собственное окно, или вообще откажись от такого
сценария), либо нужно таки топать по принципу, описанному выше.

Ответить   Вадим Шешунов Fri, 12 Mar 2004 00:25:11 +0200 (#101100)

 

Здравствуйте Вадим,

Friday, March 12, 2004, 12:25:11 AM, вы писали:

Вообще моя цель - убрать nag screen из моей программки, он появляется
при нажатии на кнопку.
Помогите пожалуйста, ибо работа стоит!

Ответить   Fri, 12 Mar 2004 09:35:37 +0200 (#101242)

 

Здравствуйте, keel.

Вот реально работающий пример. Думаю, разберёшься.

var
Form1: TForm1;
g_szCaption: PCHAR;
g_nSecLeft: integer;

implementation

{$R *.DFM}

procedure TForm1.Timer1Timer(Sender: TObject);
var hWnd : THANDLE;
begin
hWnd := FindWindow(nil, g_szCaption);
if hWnd <> 0 then
begin
dec(g_nSecLeft);
if g_nSecLeft = 0 then
EndDialog(hWnd, IDOK);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
g_nSecLeft := 2;
g_szCaption := 'Мой MessageBox.';
Timer1.Enabled := true;
MessageBox(handle,'Закроется через 2 сек.',g_szCaption, 0);
end;

Ответить   Пастернак Сергей Fri, 12 Mar 2004 10:50:18 +0200 (#101397)

 

Здравствуйте, keel!

10 марта 2004 г. в 18:28:15 GMT Вы писали:

Что бы Вы туда не вставили, все это будет выполнено только после закрытия
сообщения. Но есть, как минимум, четыре варианта решения данного вопроса
(в порядке уменьшения сложности):

1. Использование дополнительного потока.
2. Использование хуков (например WH_CBT).
3. Использование циклов простоя приложения Application.OnIdle.
4. Пересмотреть задачу, чтобы вообще не выводить сообщение на экран.

Рекомендую воспользоваться 4-м вариантом. Но если все-таки не подойдет, то
помогу с остальными тремя.

--
С уважением, Кирилл Харламов.
http://rezone.by.ru
Номер выпуска : 2520
Возраст листа : 170 (дней)
Количество подписчиков : 381
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/100408
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Wed, 10 Mar 2004 21:50:18 +0600 (#100408)

 

Могу предложить 5 вариант, используй form2.show;
вместо MessageBox. В onShow вставь form2.close;

С уважением monah
janal***@n*****.ru
--
Номер выпуска : 2530
Возраст листа : 171 (дней)
Количество подписчиков : 381
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/100583
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Thu, 11 Mar 2004 08:39:58 +0600 (#100583)

 

не совсем понятно.
Откуда нужно закрыть МессаджБох?
Из той же программы или из другой?

Ответить   Wed, 10 Mar 2004 21:10:33 +0300 (#100417)

 

==-==-=-Привета!10 марта 2004 г. (среда 14:28:15) keel (E-Mail: <dima***@s*****.by>) в мессаге
<<[Delphi6] закрыть message box>> накрапал

Лажа в том, что ты не знаешь хендла этого окна :-(
Лучше сделай свой аналог MessageBox'a (ShowMessage'a) - так будет намного проще
:-)

Ответить   -=BorMaN=- Wed, 10 Mar 2004 17:50:25 +0200 (#100492)

 

Здравствуйте -=BorMaN=-,

Wednesday, March 10, 2004, 5:50:25 PM, вы писали:

проще

Хендл я знаю(с помощью winsight узнал), скажите, этот хендл все время
один и тот же на разных машинах?

Ответить   Thu, 11 Mar 2004 15:01:29 +0200 (#100839)

 

Привет, keel.

Вы писали 10 марта 2004 г., 15:28:15:

Эта программа закрывает наг-скрин от The Bat!, надеюсь разберешься:

program LoadBat;
{$APPTYPE CONSOLE}
uses
Windows,
Registry,
Messages;

var
hForm, hPanel, hButton: THandle;
begin
WinExec({'C:\Program Files\The Bat!\}'thebat.exe', SW_SHOW);

{
HWND FindWindow(
LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);
}

hForm:=FindWindow('TUnregForm', nil);
while hForm=0 do
begin
Sleep(100);
hForm:=FindWindow('TUnregForm', nil);
end;

{
HWND FindWindowEx(
HWND hwndParent, // handle to parent window
HWND hwndChildAfter, // handle to a child window
LPCTSTR lpszClass, // pointer to class name
LPCTSTR lpszWindow // pointer to window name
);
}

hPanel:=FindWindowEx(hForm, 0, 'TPanel', nil);
while hPanel=0 do
begin
Sleep(100);
hPanel:=FindWindowEx(hForm, 0, 'TPanel', nil);
end;

hButton:=FindWindowEx(hPanel, 0, 'TButton', 'ОК');
while hButton=0 do
begin
Sleep(100);
hButton:=FindWindowEx(hPanel, 0, 'TButton', 'ОК');
end;

// нажать кнопку
SendMessage(hButton, BM_CLICK, 0, 0);
end.

Ответить   Wed, 10 Mar 2004 23:17:31 +0300 (#100511)

 

Здравствуйте Alexey,

Wednesday, March 10, 2004, 10:17:31 PM, вы писали:

Не разобрался(
Может мне просто sendmessage с закрытием этого нагскрина(message box)
поможет?
Но только нужно чтобы он закрывался из моей программы!

Ответить   Thu, 11 Mar 2004 15:03:39 +0200 (#100841)

 

Да просто в таймере (или где-нибудь в Idle) вызывай FindWindow - эта функция
ищет хендл окна по классу, заголовку (а хендл окна всегда разный, даже на
той же машине при каждом следующем отображении окна). После нахождения
хендла вызывай для него sendmessage. Кроме FindWindow окно можно искать с
помощью EnumWindows. sendmessage нужно вызывать в таймере, Idle или
отдельном процессе - так как после вызова функции отображения окна на
следующую строчку кода программы ты попадаешь только после закрытия этого
окна; конечно, после того, как таймер (и т.п.) сделал свое дело - его нужно
отключить. Если тебе непонятен английский, пользуйся переводчиками (напр.,
www.translate.ru) - все равно программисту потребуется самостоятельно
разбираться в таких вещах.
Номер выпуска : 2539
Возраст листа : 171 (дней)
Количество подписчиков : 380
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/100876
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "VladS" Thu, 11 Mar 2004 17:39:12 +0300 (#100876)

 

Доброго времени суток всем!

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

Долго молчал, так как телефон сволочи на 1,5 месяца отрубили за
неуплату.

Ответить   Sat, 13 Mar 2004 10:53:04 +0300 (#101976)

 

==-==-=-Привета!Да напиши ты свое подобие МессагБокса да и все - меньше гемора будет :-)

Ответить   -=BorMaN=- Thu, 11 Mar 2004 23:28:43 +0200 (#101099)