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

问题描述:

我的应用程序使用SendKeys导航并将数据输入到输入字段(我知道这不是最好的方法,但我必须使用这个限制)。现在,我想确保当SendKeys正常工作时正确的窗口处于活动状态。当应用程序正在运行时,如何同时检查哪个是活动窗口?

确认此问题的一种方法是在每个SendKeys命令前检查当前活动窗口。但这听起来非常详尽?有一个更好的方法吗?我不知道多少,但我正在猜测使用多线程?有任何想法吗?

+0

你为什么认为checki ng活动窗口是详尽的?这是由仪器证实,一次调用GetForegroundWindow杀死性能? – 2009-12-22 00:45:05

+0

不,我没有通过仪器确认。我只是想在每个SendKeys命令重复之前调用GetForegroundWIndows。这实际上也是我的问题的一部分 - 这是做这件事的好方法吗? – pavanred 2009-12-22 05:01:35

据我所知,从你的帖子你发送消息到不属于你的应用程序的窗口。如果是这样,那么恐怕你必须在每次SendKeys呼叫之前检查活动窗口。

+0

是的,我必须将消息发送到不属于我的应用程序的窗口。 – pavanred 2009-12-21 19:09:55

我想你必须在调用SendKeys之前检查是否有焦点,或者使用OnGotFocus和OnLostFocus跟踪自己关注的焦点。多线程不会帮助你,只有GUI线程可以与GUI进行交互。所以你可以有一个后台线程做工作,但它必须委派任何与GUI的交互。您可以通过在任何控件或窗口上调用BeginInvoke来执行此操作,并且它将以正确的线程运行代理。

编辑:哦。我错过了你没有“拥有”有问题的窗口。下面的代码将不起作用。你需要继续做你正在做的事情。您可以在每个sendkeys之前始终调用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); 
    } 
} 

如果你有一个的repetetive任务,做一个函数出来的......

警告 :刚刚编码,没有任何检查功能调用的正确性等。

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