0

我的应用程序用于SendKeys导航并将数据输入到输入字段中(我知道这不是最好的方法,但我必须克服这个限制)。现在,我想确保SendKeys在工作时正确的窗口处于活动状态。

确认这一点的一种方法是在每个命令之前检查当前活动窗口SendKeys。但这听起来很详尽?有一个更好的方法吗?我不太了解,但我猜想使用多线程?有任何想法吗?

4

4 回答 4

2

据我从您的帖子中了解到,您将消息发送到不属于您的应用程序的窗口。如果是这样,那么恐怕您必须在每次 SendKeys 调用之前检查活动窗口。

于 2009-12-21T18:18:27.733 回答
0

If you have a repetetive task, make a function out of it...

Warning: Just coded without any checking about correctness of function calls, etc.

void MySendKeyFunc(string windowTitle, IEnumerable<Keys> keys)
{
    if(!GetForegroundWindow(windowTitle)
    {
        SetForegroundWindow(windowTitle);
    }
    foreach(Key key in keys)
    {
        SendKeys(key);
    }
} 
于 2009-12-22T08:08:41.173 回答
0

编辑:哦。我错过了你没有“拥有”有问题的窗口。因此,下面的代码将不起作用。你需要继续做你正在做的事情。您总是可以在每个发送键之前调用 SetForegroundWindow。

让使用 SendKeys 的类挂钩相关表单中的 Activated 和 Deactivated 事件。

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);
    }
}
于 2009-12-22T06:55:09.287 回答
0

我认为您必须在调用 SendKeys 之前检查以查看焦点,或者使用 OnGotFocus 和 OnLostFocus 跟踪自己的焦点。多线程在这里帮不了你——只有 GUI 线程可以与 GUI 交互。所以你可以有一个后台线程在工作,但它必须委托与 GUI 的任何交互。您可以通过在任何控件或窗口上调用 BeginInvoke 来执行此操作,它将在正确的线程中运行委托。

于 2009-12-21T18:24:51.217 回答