代码之家  ›  专栏  ›  技术社区  ›  pavanred

当应用程序运行时,如何同时保持检查哪个是活动窗口?

  •  0
  • pavanred  · 技术社区  · 16 年前

    我的应用程序使用 SendKeys 浏览并在输入字段中输入数据(我知道这不是最好的方法,但我必须克服这个限制)。现在,我想确保当 发送键

    进行确认的一种方法是在每次检查前检查当前活动窗口 发送键 命令。但这听起来非常详尽?有更好的方法吗?我知道的不多,但我猜使用多线程?有什么想法吗?

    4 回复  |  直到 16 年前
        1
  •  2
  •   ironic    16 年前

        2
  •  0
  •   Pete McKinney    16 年前

    我认为,在调用SendKeys之前,您必须检查哪些内容具有焦点,或者使用OnGotFocus和OnLostFocus自己跟踪哪些内容具有焦点。在这里,多线程对您没有帮助-只有GUI线程可以与GUI交互。因此,您可以有一个后台线程来执行工作,但它必须委托与GUI的任何交互。您可以通过在任何控件或窗口上调用BeginInvoke来实现这一点,它将在正确的线程中运行委托。

        3
  •  0
  •   jgauffin    16 年前

    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);
        }
    }
    
        4
  •  0
  •   Oliver    16 年前

    如果你有一个重复的任务,把它变成一个函数。。。

    警告

    void MySendKeyFunc(string windowTitle, IEnumerable<Keys> keys)
    {
        if(!GetForegroundWindow(windowTitle)
        {
            SetForegroundWindow(windowTitle);
        }
        foreach(Key key in keys)
        {
            SendKeys(key);
        }
    }