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

Вниз

как изменить в сис.меню 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 вся ветка

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

Наверх




Память: 0.5 MB
Время: 0.026 c
1-11199
Sego
2002-10-24 19:58
2002.11.04
чтение открытого текстового файла.


3-11115
Антоха
2002-10-16 12:42
2002.11.04
Констрайнт


3-11052
ACR
2002-10-15 02:00
2002.11.04
ACCESS


14-11418
Sr. &#9788;
2002-10-13 00:09
2002.11.04
---|Ветка была без названия|---


3-11045
Inan61
2002-10-14 16:28
2002.11.04
RxDBGrid1TitleClick и RxDBGrid1TitleBtnClick