Сделайте форму не focusable в C#

Я желаю записать виртуальную клавиатуру, как экранная клавиатура окон для ПК с сенсорным экраном. Но у меня есть проблема с моей виртуальной клавиатурой, крадя фокус из используемого приложения. Экранная клавиатура окон уделяет внимание на текущее приложение, даже когда пользователь нажимает на него. Существует ли способ сделать то же с формами окон в C#?

Единственная вещь, которую я могу сделать на данный момент, состоит в том, чтобы отправить событие клавиатуры в especific приложение, как блокнот в следующем коде. Если я мог бы сделать форму не focusable, я мог бы получить текущее сфокусированное окно с GetForegroundWindow.

[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName,string lpWindowName);


[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

private void button1_Click(object sender, EventArgs e)
{
    IntPtr calculatorHandle = FindWindow("notepad", null);
    SetForegroundWindow(calculatorHandle);
    SendKeys.SendWait("111");
}

Существует ли способ, которым это может быть сделано? Какие-либо предложения лучшего способа иметь форму, отправляющую события клавиатуры в используемое приложение?

Спасибо!!

13
задан Jandex 11 March 2010 в 07:22
поделиться

2 ответа

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

Взгляните на эту статью . В конце автор кратко объясняет, как это можно сделать:

Как я могу предотвратить активацию и фокус моего окна при отображении?

В Windows Forms 2.0 есть новое свойство под названием ShowWithoutActivation - которые вам нужно будет переопределить в форме. В собственных приложениях вы можете использовать SetWindowPos с флагом SWP_NOACTIVATE или ShowWindow с флагом SW_SHOWNA.

Кроме того, в этой статье он приводит пример кода для Windows Forms:

Если вам нужна полноценная форма, теперь вы можете переопределить свойство под названием ShowWithoutActivation :

 открытый класс NoActivateForm: форма {
защищенное переопределение bool ShowWithoutActivation {
get {
return true; 
} 
} 
} 

Имейте в виду, что это не «предотвращает» активацию все время - вы все равно можете активировать, позвонив по номеру Методы Activate () , Focus () … и т. Д. Если вы хотите, чтобы клики в клиентской области не активировали окно , вы можете обработать сообщение WM_MOUSEACTIVATE .

 private const int WM_MOUSEACTIVATE = 0x0021, MA_NOACTIVATE = 0x0003; 
 
защищенное переопределение void WndProc (ссылка на сообщение m) {
if (m.Msg == WM_MOUSEACTIVATE) {{ {1}} m.Result = (IntPtr) MA_NOACTIVATE; 
return; 
} 
base.WndProc (ref m); 
} 
9
ответ дан 1 December 2019 в 22:22
поделиться

Его решено!

Я пробовал решение от gehho, но мне также нужно было переопределить метод CreateParams:

private const int WS_EX_NOACTIVATE = 0x08000000;
protected override CreateParams CreateParams
    {
        get
        {
            CreateParams createParams = base.CreateParams;
            createParams.ExStyle |= WS_EX_NOACTIVATE;
            return createParams;
        }
    }
13
ответ дан 1 December 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: