Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-11439
slipper
2002-10-14 19:32
2002.11.04
Рихтер


1-11265
SanyaLaz
2002-10-23 11:16
2002.11.04
Помогите !!!!!!!!


1-11225
Юрий
2002-10-22 22:53
2002.11.04
Как создать событие в компоненте?


1-11145
DiGiTaL
2002-10-24 10:59
2002.11.04
Как грамотно проверить наличие Word а на компьтере?


6-11363
tararasyk
2002-09-05 02:33
2002.11.04
Dial up + Server(Client)Socket,





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский