Изменить систему языка с ошибкой таймераC#

Место общения программистов C#
Ответить
Anonymous
 Изменить систему языка с ошибкой таймера

Сообщение 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;
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... -timer-bug
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»