Форум: "WinAPI";
Текущий архив: 2002.11.04;
Скачать: [xml.tar.bz2];
Внизкак изменить в сис.меню Alt+F4 на Ctrl+F4? Найти похожие ветки
← →
chsv (2002-09-16 18:57) [0]Как изменить в системном меню Alt+F4 на Ctrl+F4?
← →
Song (2002-09-16 19:35) [1]Перехватить Alt+F4, заблокировать. Перехватить Ctrl+F4 - закрыть приложение.
← →
chsv (2002-09-17 18:27) [2]С перехватом клавиш нет проблем, но как заменить в системном меню сам текст " Alt+F4" на " Ctrl+F4"?
Спасибо за ответ
← →
Song (2002-09-17 19:01) [3]DeleteMenuItem() --> InsertMenuItem() или
ModifyMenu()
← →
chsv (2002-09-18 18:51) [4]экий ты непонятливый! :)
в этих функциях отсутствует возможность переопределить акселератор (по крайней мере, я не нашел).
поэтому я и не хочу возиться с перехватом клавиатурных событий, а хочу переопределить клавиатурный акселератор системного меню данного окна с Alt+F4 на Ctrl+F4. считаю, что после изменения акселератора винда сама выведет в системно меню правильное значение -- Ctrl+F4.
но я незнаю, как переопределить акселератор :((
← →
REA (2002-09-19 10:59) [5]Вопрос из серии "как отстрелить себе ногу". Зачем менять то? Чтоб враги не догадались?
Типа такого:
// Count the number of entries in the current
// table, allocate a buffer for the table, and
// then copy the table into the buffer.
cAccelerators = CopyAcceleratorTable(
haccelOld, NULL, 0);
lpaccelNew = (LPACCEL) LocalAlloc(LPTR,
cAccelerators * sizeof(ACCEL));
if (lpaccelNew != NULL)
{
CopyAcceleratorTable(haccel, lpaccelNew,
cAccelerators);
}
// Find the accelerator that the user modified
// and change its flags and virtual-key code
// as appropriate.
for (i = 0; (lpaccelNew[i].cmd ==
(WORD) idItem)
&& (i < (UINT) cAccelerators); i++)
{
lpaccelNew[i].fVirt = fAccelFlags;
lpaccelNew[i].key = wVKCode;
}
// Create the new accelerator table, and
// destroy the old one.
DestroyAcceleratorTable(haccelOld);
haccel = CreateAcceleratorTable(lpaccelNew,
cAccelerators);
← →
chsv (2002-09-19 19:00) [6]Не "чтоб враги не догадались", а чтобы прежде всего облегчить жизнь себе.
Согласитесь, что подход, предлагаемый Song"ом, хоть и проще
для кодирования, но все-таки является заплаткой, порождающей
свои проблемы.
Если выполнить
DeleteMenu(<команда "Закрыть Alt+F4">);
InsertMenu(<команда "Закрыть Ctrl+F4">);
то кнопка закрытия окна становится недоступной (можете проверить).
Команда
ModifyMenu(<команда "Закрыть Ctrl+F4">);
дает аналогичный результат. Похоже, здесь нужно каким-то образом (каким -- пока не знаю) дать знать винде, что модифицированная команда выполняет ту же функцию (функцию закрытия), что и стандартная команда " Закрыть Alt+F4".
Но даже если сделать это, винда по-прежнему будет закрывать окно по Alt+F4, а не по Ctrl+F4, т.к. ModifyMenu() изменяет надпись пункта меню, а не его акселератор. Поэтому придется ловить в окне Alt+F4, зарубать его; ловить Ctrl+F4 и выпонять Close.
Поэтому-то у меня и возникло подозрение, что в винде должна быть более изящная возможность переопределить для системного меню данного конкретного окна стандартный акселератор на другой.
(Кстати, в том, что такой возможности нет, меня пока никто не убедил). :)
Но даже если такой возможности нет и придется извращаться,
как в приведенном вами (REA) примере -- это еще один камешек в огород дяди Билла.
← →
Song (2002-09-19 19:45) [7]Включите обратно команду через EnableMenuItem() когда кнопка "Закрыть" станет неактивной.
← →
chsv (2002-09-20 18:51) [8]???
← →
PaRL (2002-09-21 15:05) [9]Может попробовать так:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
protected
procedure Hot(var M : TWMHOTKEY); message WM_HOTKEY;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Hot(var M : TWMHOTKEY);
begin
if M.HotKey = 2 then Close;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
RegisterHotKey(Handle, 1, MOD_ALT, 115);
RegisterHotKey(Handle,2, MOD_CONTROL, 115);
end;
end.
Тогда типа ALT-F4 отключается, а Ctrl-F4 закрывает окно, если вы про это...
← →
chsv (2002-09-23 19:21) [10]Ну ты крутик! :)
Но это все равно не совсем то. Окно действительно реагирует теперь на Ctrl+F4, но в системном меню все-равно нужно изменить надпись. Так что твой подход фактически равноценен перехвату "вручную" Alt+А4 и подмене его Ctrl+F4.
~~~~~~~~~~~~~~~~~~~~~~~~~~
Информация для размышления
~~~~~~~~~~~~~~~~~~~~~~~~~~
В системном меню дочернего окна MDI-приложения Ctrl+F4 задействуется автоматически, достаточно установить FormStyle = fsMDIChild.
Винда (или Delphi -- ?), помимо выполнения прочих действий, связанных с обеспечением работы окна в стиле MDIChild, так же выполняют и требуемую подмену -- заменяют текст надписи "x Закрыть Alt+F4" на "x Закрыть Ctrl+F4". Я думаю, данная подмена будет корректно работать на любой версии виндовуз -- на немецкой, например.
Вопрос -- как заставить винду выполнить данную подмену для данного конкретного окна?
Поскольку системное меню любого окна относится скорее к атрибутам операционной сисемы, чем к атрибутам приложения, отображаемого в данном окне, то и заниматься изменением системного меню должна операционная сисиетма -- хотя бы в части стандартных команд -- "переместить", "максимизировать", "минимизировать", "закрыть". Т.е. нужно только знать, каким образом сообщить винде о характере корректировки системного меню (это вопрос).
А изменять стандартные команды системного меню из приложения не есть хорошо. Представляете, как будет выглядеть системное меню такого приложения на том же немецком видовсе?
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.11.04;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c