Я желаю записать виртуальную клавиатуру, как экранная клавиатура окон для ПК с сенсорным экраном. Но у меня есть проблема с моей виртуальной клавиатурой, крадя фокус из используемого приложения. Экранная клавиатура окон уделяет внимание на текущее приложение, даже когда пользователь нажимает на него. Существует ли способ сделать то же с формами окон в 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");
}
Существует ли способ, которым это может быть сделано? Какие-либо предложения лучшего способа иметь форму, отправляющую события клавиатуры в используемое приложение?
Спасибо!!
Вместо того, чтобы пытаться сбросить активное окно после того, как вы щелкнули по вашему, я бы предпочел предотвратить активацию вашего окна.
Взгляните на эту статью . В конце автор кратко объясняет, как это можно сделать:
Как я могу предотвратить активацию и фокус моего окна при отображении?
В 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); }
Его решено!
Я пробовал решение от 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;
}
}