Форум: "Начинающим";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c