Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.18;
Скачать: CL | DM;

Вниз

MessageBox   Найти похожие ветки 

 
MakNik   (2005-12-02 11:28) [0]

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


 
ANB ©   (2005-12-02 12:18) [1]


> MakNik   (02.12.05 11:28)

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


 
han_malign ©   (2005-12-02 12:53) [2]

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


 
han_malign ©   (2005-12-02 12:55) [3]

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


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

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


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

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


 
han_malign ©   (2005-12-02 16:01) [6]


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

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


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

- не нужно ничего переопределять(да и не получится), делаешь функциональную обертку и везде используешь ее вместо 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.


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

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


 
han_malign ©   (2005-12-02 16:13) [8]


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

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


 
Leonid Troyanovsky ©   (2005-12-02 17:48) [9]


> MakNik   (02.12.05 16:06) [7]

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


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

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2005.12.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.039 c
14-1133105555
DeMoN[777]
2005-11-27 18:32
2005.12.18
Помогите с выбором КПК


6-1125821792
mm0
2005-09-04 12:16
2005.12.18
Как отправить e-mail без smpt


2-1133375572
312Kbps
2005-11-30 21:32
2005.12.18
Путь к файлу !


8-1121283501
melena
2005-07-13 23:38
2005.12.18
пульсирующий шарик


2-1132726445
AndreyAR
2005-11-23 09:14
2005.12.18
Не виден сервер