Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MessageBox [D5, WinXP]


MakNik ©   (2005-12-02 11:28:00) 

Подскажите, пожалуйста, как отличить нажатие кнопки ОК в MessageBox от нажатия кнопки ОК с удерживанием при этом клавиши Alt или Ctrl или Shift  или любой другой клавиши?


Leonid Troyanovsky   (2005-12-02 17:48:00) [1]


> MakNik   (02.12.05 16:06) [7]

> клавиши... вот и хочется, если это возможно, переопределить
> событие нажатия на кнопки в MessageBox...


На собственный поток ставится хук WH_CALLWNDPROC, в котором
отлавливается WM_DESTROY, и если оно пришло от окна класса #32770,
то, это был диалог. Там и можно определить состояние нажатых клавиш,
как было описано ранее.

--
Regards, LVT.


han_malign   (2005-12-02 16:13:00) [2]


> переопределить событие нажатия на кнопки в MessageBox...

- Windows в Uses обычно идет первым, если есть "твой" модуль который подключается во всех модулях, делаешь там как написано выше - чем перекрываешь область видимости Windows.MessageBox - и "Вот оно, счастье..."(с)


MakNik   (2005-12-02 16:06:00) [3]

Это типа "дыры" для админа... в системе есть места, которые ограничены бизнеслогикой... в процессе работы под определенным пользователем возникает момент когда пользователю не хватает прав на выполнение определенного действия. В этот момент необходимо прервать работу диалога и вызвать окно изменения пользователя (или ввода пароля для выполнения определенного действия). .... в общем все запутано и запущенно... "это нельзя понять, это нужно запомнить" (С) ;) ... в общем теперь, когда этот вопрос назрел окончательно, уж больно лень переделывать все вызовы MessageBox для вставки туда проверки на удерживание клавиши... вот и хочется, если это возможно, переопределить событие нажатия на кнопки в MessageBox...


han_malign   (2005-12-02 16:01:00) [4]


> Извиняюсь за оффтопик, но "просто интересно" (ц)

- обычная закладка(пасхальное яйцо)...


> подскажите еще, плз., как переопределить событие нажатия на кнопки

- не нужно ничего переопределять(да и не получится), делаешь функциональную обертку и везде используешь ее вместо MessageBox...

Примерно так:
unit MBShift;
interface
uses Windows;
const ID_LSHIFT_OK = $8000 + ID_OK;
function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): integer;
implementation
function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): integer;
begin
    Result:= Windows.MessageBox(hWnd, lpText, lpCaption, uType);
    if((Result = ID_OK)and(GetKeyState(VK_LSHIFT) and $8000 <> 0))then ...
end;
end.


При этом достаточно чтобы в uses - MBShift был после Windows.
Хотя этот пример не очень корректен, т.к. может привести к путаннице где какая функция используется и лучше ввести другое имя функции, например ShiftMessageBox.


DiamondShark   (2005-12-02 15:32:00) [5]

Извиняюсь за оффтопик, но "просто интересно" (ц)
а на какого лешего понадобилось столь свежее интерфейсное решение?


MakNik   (2005-12-02 15:11:00) [6]

Спасибо, работает... это то что нужно... но хотелось бы автоматизировать процесс... т.к. во всем приложении есть много MessageBox чтобы не переписовать всех их... подскажите еще, плз., как переопределить событие нажатия на кнопки MessageBox так, чтобы во всем приложении при вызове ф-ции MessageBox и нажатии на ОК (с удержанием при этом нажатой кнопки Shift) выполнялось определенное действие??


han_malign   (2005-12-02 12:55:00) [7]

или, то-же самое - Application.KeyState


han_malign   (2005-12-02 12:53:00) [8]

только по состоянию кнопки после выхода из диалога:
mres:= MessageBox(...);
if((mres = ID_OK)and(GetKeyState(VK_LSHIFT) and $8000 <> 0))then ...


ANB   (2005-12-02 12:18:00) [9]


> MakNik   (02.12.05 11:28)

А как ты вообще отличаешь, что это кнопка нажималась ?
Окно не твое - ничего ты в нем не сделаешь. Нарисуй свой MessageBox и в нем проверяй, что тебе надо.


Наверх

Титульная страница Поиск, карта сайта Написать письмо