Вопрос:

Запретить кнопке получать фокус в Inno Setup

inno-setup

260 просмотра

1 ответ

81 Репутация автора

В моем скрипте, когда кнопка аудио нажата, она получает фокус ( Эта синяя толстая граница )

Мой вывод


Я хочу, чтобы это было, даже когда вы нажимаете кнопку аудио, сфокусированная кнопка по-прежнему остается «Далее / Установить» .

Что я хочу

Автор: DDoS Источник Размещён: 08.11.2016 06:57

Ответы (1)


1 плюс

95702 Репутация автора

Решение

Это трудно реализовать из-за отсутствия OnEnterсобытий в Inno Setup API.

Во-первых, вы хотите установить TabStopсвойство кнопки, Falseчтобы кнопка не получала фокус с помощью Tabклавиши.

Button.TabStop := False;

( В твоем случае это и есть SoundCtrlButton).

Если вы довольны фокусировкой, всегда возвращаясь к кнопке «Далее» , когда вы щелкаете мышью, это легко. Просто установите фокус на кнопку «Далее» в конце OnClickобработчика кнопки :

procedure ButtonClick(Sender: TObject);
begin
  { Some actual code }

  { If the button is focused (it won't be, when access key was used to "click" it) ... }
  if TButton(Sender).Focused then
    { ... focus the "Next" button }
    WizardForm.ActiveControl := WizardForm.NextButton;
end;

(В твоем случае OnClickобработчик есть SoundCtrlButtonClick).


Однако, если вы хотите реализовать это красиво, вернув фокус обратно к элементу управления, который ранее имел фокус, это будет сложнее.

Я не могу придумать лучшего решения, чем планирование частого таймера для контроля за сфокусированным контролем.

[Code]

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; 
  lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';

var
  LastFocusedControl: TWinControl;

procedure FocusMonitorProc(
  H: LongWord; Msg: LongWord; IdEvent: LongWord; Time: LongWord);
begin
  { Remember focused control, unless the currently focused control is already the one, }
  { we do not want to get focused }
  if (WizardForm.ActiveControl = nil) or
     WizardForm.ActiveControl.TabStop then
  begin
    LastFocusedControl := WizardForm.ActiveControl;
  end;
end;

procedure ButtonClick(Sender: TObject);
begin
  { Some actual code }

  { If the button is focused (it won't be, when access key was used to "click" it) ... }
  if TButton(Sender).Focused and (LastFocusedControl <> nil) then
    { ... focus the previously focused control }
    WizardForm.ActiveControl := LastFocusedControl;
end;

procedure InitializeWizard();
begin
  { Set up 50ms timer to monitor the focus }
  SetTimer(0, 0, 50, CreateCallback(@FocusMonitorProc));  

  { Create the "unfocusable" button }
  SomeButton := TNewButton.Create(WizardForm);
  { Initialize button }
  SomeButton.TabStop := False;  
end;

Для CreateCallbackфункции вам потребуется Inno Setup 6. Если вы застряли с Inno Setup 5, вы можете использовать WrapCallbackфункцию из библиотеки InnoTools InnoCallback .


Альтернативное решение - использовать изображение в виде кнопки ( TBitmapImageэлемент управления ) вместо фактического TButton. Элемент TBitmapImageуправления (не будучи TWinControl) не может получить фокус вообще.

И это может фактически дать вам хорошее "немое" изображение вместо простой надписи "Без звука" .

Автор: Martin Prikryl Размещён: 08.11.2016 07:42
Вопросы из категории :
32x32