Я хочу написать программу, которая отслеживает процесс. Если процесс захватывает фокус, программа должна сменить клавиатуру на ту, которая выбрана в списке, в котором перечислены установленные клавиатуры (lst_box_clavier1). Если отслеживаемый процесс теряет фокус, программа должна сменить клавиатуру на ту, что выбрана в lst_box_clavier2.
Для этого я использую таймер, интервал мониторинга которого задается пользователем. Первый таймер, вызывающий timer_data, работает как есть, он отслеживает, какой процесс имеет фокус, и отмечает это в lbl_active_process и то же самое для активной клавиатуры. После нажатия кнопки «Пуск» он запускает timer_switch, который сравнивает содержимое активного lbl_processus и txt_box_processus. Если результаты совпадают и, следовательно, отслеживаемый процесс имеет фокус, он переключается на клавиатуру, выбранную в lst_box_clavier1, если это не совпадает, поэтому процесс не имеет фокуса, он активирует клавиатуру, указанную в lst_box_clavier2.
Конечная цель — отслеживать процесс (в моем случае видеоигра, не предлагающая изменять клавиши) и переключаться между qwerty и azerty в зависимости от того, есть ли у него фокус.
Но у текущей логики есть проблема: если я помещу изменение клавиатуры вне условия if timer_switch, оно изменится каждый раз x (определенный интервал), но если я поставлю его в условие проверки, оно изменится только тогда, когда мое программное обеспечение восстановит фокус. Я добавил метку, которая показывает результат условия, говоря, имеет ли мой процесс фокус или нет, но для смены клавиатуры это выполняется только в том случае, если мое программное обеспечение имеет фокус, что бесполезно, и я должен обнаружить изменение, иначе оно будет бесполезным.
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection.Emit;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace ClavierSwitch
{
public partial class Form_Main : System.Windows.Forms.Form
{
public string LayoutName { get; }
public void GetLanguages()
{
// Gets the list of installed languages.
foreach (InputLanguage lang in InputLanguage.InstalledInputLanguages)
{
Lst_Box_Clavier1.Items.Add(lang.LayoutName);
Lst_Box_Clavier2.Items.Add(lang.LayoutName);
}
}
public void SetLang(int ind)
{
InputLanguage.CurrentInputLanguage = InputLanguage.InstalledInputLanguages[ind];
}
public Form_Main()
{
InitializeComponent();
}
private void Form_Main_Load(object sender, EventArgs e)
{
GetLanguages();
}
private void timer_Donnees_Tick(object sender, EventArgs e)
{
InputLanguage ClavierActif = InputLanguage.CurrentInputLanguage;
if (ClavierActif != null)
Lbl_Clavier_Actif.Text = ClavierActif.LayoutName;
else
Lbl_Clavier_Actif.Text = "Langue Clavier Actif : Il n'y a pas de langue actuelle";
Process fgProc = ProcessUtils.getForegroundProcess();
Lbl_Processus_Actif.Text = fgProc.ProcessName;
}
private void Chk_Box_Switch_CheckedChanged(object sender, EventArgs e)
{
}
private void Bt_Demarre_Click(object sender, EventArgs e)
{
if (timer_Switch.Enabled)
{
timer_Switch.Enabled = false;
Lbl_Etat.Text = "Inactif";
Lbl_Etat.ForeColor = Color.Red;
Bt_Demarre.Text = "Demarrer";
Txt_Box_Interval.Enabled = true;
Txt_Process.Enabled = true;
Lst_Box_Clavier1.Enabled = true;
Lst_Box_Clavier2.Enabled = true;
}
else
{
string numString = Txt_Box_Interval.Text;
long number1 = 0;
bool canConvert = long.TryParse(numString, out number1);
if (canConvert == true)
{
timer_Switch.Enabled = true;
timer_Switch.Interval = Convert.ToInt32(Txt_Box_Interval.Text);
Lbl_Etat.Text = "Actif";
Lbl_Etat.ForeColor = Color.Green;
Bt_Demarre.Text = "Arreter";
Txt_Box_Interval.Enabled = false;
Txt_Process.Enabled = false;
Lst_Box_Clavier1.Enabled = false;
Lst_Box_Clavier2.Enabled = false;
}
else
{
Lbl_Etat.Text = "Intervalle non valide";
Txt_Box_Interval.Text = "1000";
}
}
}
private void timer_Switch_Tick(object sender, EventArgs e)
{
string strProc = Txt_Process.Text;
string strProcLbl = Lbl_Processus_Actif.Text;
int result = String.Compare(strProc, strProcLbl);
if (result == 1)
{
SetLang(Lst_Box_Clavier2.SelectedIndex);
Lbl_Control.Text = "Controle : Non Focus";
}
else
{
SetLang(Lst_Box_Clavier1.SelectedIndex);
Lbl_Control.Text = "Controle : Focus";
}
}
private void Lst_Box_Clavier1_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void Lst_Box_Clavier2_SelectedIndexChanged(object sender, EventArgs e)
{
}
}
class ProcessUtils
{
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll", SetLastError = true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
public static Process getForegroundProcess()
{
uint processID = 0;
IntPtr hWnd = GetForegroundWindow(); // Get foreground window handle
uint threadID = GetWindowThreadProcessId(hWnd, out processID); // Get PID from window handle
Process fgProc = Process.GetProcessById(Convert.ToInt32(processID)); // Get it as a C# obj.
// NOTE: In some rare cases ProcessID will be NULL. Handle this how you want.
return fgProc;
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... -timer-bug
Изменить систему языка с ошибкой таймера ⇐ C#
Место общения программистов C#
1731448145
Anonymous
Я хочу написать программу, которая отслеживает процесс. Если процесс захватывает фокус, программа должна сменить клавиатуру на ту, которая выбрана в списке, в котором перечислены установленные клавиатуры (lst_box_clavier1). Если отслеживаемый процесс теряет фокус, программа должна сменить клавиатуру на ту, что выбрана в lst_box_clavier2.
Для этого я использую таймер, интервал мониторинга которого задается пользователем. Первый таймер, вызывающий timer_data, работает как есть, он отслеживает, какой процесс имеет фокус, и отмечает это в lbl_active_process и то же самое для активной клавиатуры. После нажатия кнопки «Пуск» он запускает timer_switch, который сравнивает содержимое активного lbl_processus и txt_box_processus. Если результаты совпадают и, следовательно, отслеживаемый процесс имеет фокус, он переключается на клавиатуру, выбранную в lst_box_clavier1, если это не совпадает, поэтому процесс не имеет фокуса, он активирует клавиатуру, указанную в lst_box_clavier2.
Конечная цель — отслеживать процесс (в моем случае видеоигра, не предлагающая изменять клавиши) и переключаться между qwerty и azerty в зависимости от того, есть ли у него фокус.
Но у текущей логики есть проблема: если я помещу изменение клавиатуры вне условия if timer_switch, оно изменится каждый раз x (определенный интервал), но если я поставлю его в условие проверки, оно изменится только тогда, когда мое программное обеспечение восстановит фокус. Я добавил метку, которая показывает результат условия, говоря, имеет ли мой процесс фокус или нет, но для смены клавиатуры это выполняется только в том случае, если мое программное обеспечение имеет фокус, что бесполезно, и я должен обнаружить изменение, иначе оно будет бесполезным.
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection.Emit;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace ClavierSwitch
{
public partial class Form_Main : System.Windows.Forms.Form
{
public string LayoutName { get; }
public void GetLanguages()
{
// Gets the list of installed languages.
foreach (InputLanguage lang in InputLanguage.InstalledInputLanguages)
{
Lst_Box_Clavier1.Items.Add(lang.LayoutName);
Lst_Box_Clavier2.Items.Add(lang.LayoutName);
}
}
public void SetLang(int ind)
{
InputLanguage.CurrentInputLanguage = InputLanguage.InstalledInputLanguages[ind];
}
public Form_Main()
{
InitializeComponent();
}
private void Form_Main_Load(object sender, EventArgs e)
{
GetLanguages();
}
private void timer_Donnees_Tick(object sender, EventArgs e)
{
InputLanguage ClavierActif = InputLanguage.CurrentInputLanguage;
if (ClavierActif != null)
Lbl_Clavier_Actif.Text = ClavierActif.LayoutName;
else
Lbl_Clavier_Actif.Text = "Langue Clavier Actif : Il n'y a pas de langue actuelle";
Process fgProc = ProcessUtils.getForegroundProcess();
Lbl_Processus_Actif.Text = fgProc.ProcessName;
}
private void Chk_Box_Switch_CheckedChanged(object sender, EventArgs e)
{
}
private void Bt_Demarre_Click(object sender, EventArgs e)
{
if (timer_Switch.Enabled)
{
timer_Switch.Enabled = false;
Lbl_Etat.Text = "Inactif";
Lbl_Etat.ForeColor = Color.Red;
Bt_Demarre.Text = "Demarrer";
Txt_Box_Interval.Enabled = true;
Txt_Process.Enabled = true;
Lst_Box_Clavier1.Enabled = true;
Lst_Box_Clavier2.Enabled = true;
}
else
{
string numString = Txt_Box_Interval.Text;
long number1 = 0;
bool canConvert = long.TryParse(numString, out number1);
if (canConvert == true)
{
timer_Switch.Enabled = true;
timer_Switch.Interval = Convert.ToInt32(Txt_Box_Interval.Text);
Lbl_Etat.Text = "Actif";
Lbl_Etat.ForeColor = Color.Green;
Bt_Demarre.Text = "Arreter";
Txt_Box_Interval.Enabled = false;
Txt_Process.Enabled = false;
Lst_Box_Clavier1.Enabled = false;
Lst_Box_Clavier2.Enabled = false;
}
else
{
Lbl_Etat.Text = "Intervalle non valide";
Txt_Box_Interval.Text = "1000";
}
}
}
private void timer_Switch_Tick(object sender, EventArgs e)
{
string strProc = Txt_Process.Text;
string strProcLbl = Lbl_Processus_Actif.Text;
int result = String.Compare(strProc, strProcLbl);
if (result == 1)
{
SetLang(Lst_Box_Clavier2.SelectedIndex);
Lbl_Control.Text = "Controle : Non Focus";
}
else
{
SetLang(Lst_Box_Clavier1.SelectedIndex);
Lbl_Control.Text = "Controle : Focus";
}
}
private void Lst_Box_Clavier1_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void Lst_Box_Clavier2_SelectedIndexChanged(object sender, EventArgs e)
{
}
}
class ProcessUtils
{
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll", SetLastError = true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
public static Process getForegroundProcess()
{
uint processID = 0;
IntPtr hWnd = GetForegroundWindow(); // Get foreground window handle
uint threadID = GetWindowThreadProcessId(hWnd, out processID); // Get PID from window handle
Process fgProc = Process.GetProcessById(Convert.ToInt32(processID)); // Get it as a C# obj.
// NOTE: In some rare cases ProcessID will be NULL. Handle this how you want.
return fgProc;
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79182816/modify-lang-system-with-timer-bug[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия