Создание виртуальной цифровой клавиатуры: не позволяйте форме активироваться / фокусироваться - PullRequest
0 голосов
/ 14 мая 2009

Я хочу создать виртуальную цифровую клавиатуру, похожую на экранную клавиатуру. Как я могу предотвратить активацию / фокусирование формы, чтобы при нажатии на нее кнопка SendKeys.Send перешла в нужную форму? Я уверен, что для этого мне нужно использовать неуправляемый API, но, кроме того, я даже не уверен, с чего начать. Спасибо за любую помощь!

Ответы [ 4 ]

1 голос
/ 15 мая 2009

Вы можете контролировать способ создания формы, переопределив защищенное свойство CreateParams:

protected override CreateParams CreateParams {
  get {
    var cp = base.CreateParams;
    // Configure the CreateParams structure here
    return cp;
  }
}

Я предлагаю попробовать следующий стиль:

int WS_EX_NOACTIVATE = 0x08000000;
cp.ExStyle = cp.ExStyle | WS_EX_NOACTIVATE;

Стиль WS_EX_NOACTIVATE не позволяет вводить мышью фокус окна (вы можете использовать его, например, для создания окон, похожих на подсказки).

Вы можете комбинировать это с другими стилями (например, WS_EX_TOPMOST), чтобы получить поведение, к которому вы стремитесь.

0 голосов
/ 14 мая 2009

Если цифровая клавиатура должна работать только в тех приложениях, которые вы пишете, вы можете просто отслеживать последний действительный элемент управления вводом, на котором был фокус. Таким образом, вам не нужно беспокоиться о чем-то, крадущем фокус. Недавно я сделал нечто подобное, подписав связку события Enter TextBoxes на тот же обработчик события, который установил для моего сфокусированного дескриптора управления параметр sender. Этот точный метод может не сработать, но такой подход может упростить его.

0 голосов
/ 14 мая 2009

При написании приложений рассмотрите шаблон Observer.

В общем случае вы можете добавить метод Subscribe к вашей клавиатуре, который принимает делегата (также позволяет отменить подписку) Для обработки события нажатия клавиши, переберите всех подписанных делегатов, отправив ему код символа.

Код (в основном из памяти, фрагменты, вероятно, не скомпилируются, но должны помочь вам)

delegate void KeyPadSubscription (char keyPressed);
List<KeyPadSubscription> subscriptions;

void KeyPress (object sender, KeyPressArgs e)
{
   foreach (KeyPadSubscription sub in subscriptions)
        sub (e.CharCode)
}

void Subscribe(KeyPadSubscription s)
{
    subscriptions.Add(s);
}

void Unsubscribe(KeyPadSubscription s)
{
    subscriptions.Remove(s);
}

В вашем случае вам, вероятно, не нужен список делегатов, а свойства может быть достаточно. Затем, когда ваши формы меняют фокус, активная форма устанавливает свой метод в качестве делегата для вашей клавиатуры.

void MyForm_Activated(...)
{
    //assumes keypad is global or static
    KeyPad.Subsribe (this.HandleKeyPadPress)
}
0 голосов
/ 14 мая 2009

Форма, которая не имеет фокуса, обычно не получает ввод с клавиатуры. Так что я не уверен, как вы могли бы заставить это работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...