Когда приложение работает, как продолжать проверять, какое окно активно одновременно? - PullRequest
0 голосов
/ 21 декабря 2009

Мое приложение использует SendKeys для навигации и ввода данных в поля ввода (я знаю, что это не лучший способ сделать это, но я должен работать с этим ограничением). Теперь я хочу убедиться, что правильное окно активно, когда SendKeys работают.

Один из способов подтвердить это - проверять текущее активное окно перед каждой SendKeys командой. Но это звучит очень исчерпывающе? Есть лучший способ сделать это? Я не знаю много, но думаю, используя многопоточность? Есть идеи?

Ответы [ 4 ]

2 голосов
/ 21 декабря 2009

Насколько я понимаю из вашего поста вы отправляете сообщения в окна, которые не принадлежат вашему приложению. Если так, то, боюсь, вам нужно проверять активное окно перед каждым вызовом SendKeys.

0 голосов
/ 22 декабря 2009

Если у вас есть повторяющееся задание, сделайте из него функцию ...

Предупреждение : только что закодировано без проверки правильности вызовов функций и т. Д.

void MySendKeyFunc(string windowTitle, IEnumerable<Keys> keys)
{
    if(!GetForegroundWindow(windowTitle)
    {
        SetForegroundWindow(windowTitle);
    }
    foreach(Key key in keys)
    {
        SendKeys(key);
    }
} 
0 голосов
/ 22 декабря 2009

Редактировать: Ооо. Я упустил, что вы не «владеете» рассматриваемым окном. Поэтому приведенный ниже код не будет работать. Вы должны продолжать делать то, что вы делаете. Вы всегда можете вызвать SetForegroundWindow перед каждым sendkeys.

Позвольте классу, использующему SendKeys, перехватывать события Activated и Deactivation из рассматриваемой формы.

internal class SendKeysClass
{
    private bool _canSend;

    public SendKeysClass(Form form)
    {
        form.Activated += (sender, args) => _canSend = true;
        form.Deactivate += (sender, args) => _canSend = false;
    }

    public void Send(string keys)
    {
        if (!_canSend)
            return;

        SendKeys.Send(keys);
    }
}

Или, если вы не используете .Net 3.5 / C # 3.0:

internal class SendKeysClass
{
    private bool _canSend;

    public SendKeysClass(Form form)
    {
        form.Activated += OnActivated;
        form.Deactivate += OnDeactivated;
    }

    private void OnDeactivated(object sender, EventArgs e)
    {
        _canSend = false;
    }

    private void OnActivated(object sender, EventArgs e)
    {
        _canSend = true;
    }

    public void Send(string keys)
    {
        if (!_canSend)
            return;

        SendKeys.Send(keys);
    }
}
0 голосов
/ 21 декабря 2009

Я думаю, вам придется либо проверить, что находится в фокусе, прежде чем вызывать SendKeys, либо отслеживать, что находится в фокусе самостоятельно, используя OnGotFocus и OnLostFocus. Многопоточность здесь не поможет вам - только GUI-поток может взаимодействовать с GUI. Таким образом, у вас может быть фоновый поток, выполняющий работу, но он должен делегировать любые взаимодействия с GUI. Вы можете сделать это, вызвав BeginInvoke для любого элемента управления или окна, и он запустит делегат в нужном потоке.

...