我的应用程序用于SendKeys
导航并将数据输入到输入字段中(我知道这不是最好的方法,但我必须克服这个限制)。现在,我想确保SendKeys
在工作时正确的窗口处于活动状态。
确认这一点的一种方法是在每个命令之前检查当前活动窗口SendKeys
。但这听起来很详尽?有一个更好的方法吗?我不太了解,但我猜想使用多线程?有任何想法吗?
我的应用程序用于SendKeys
导航并将数据输入到输入字段中(我知道这不是最好的方法,但我必须克服这个限制)。现在,我想确保SendKeys
在工作时正确的窗口处于活动状态。
确认这一点的一种方法是在每个命令之前检查当前活动窗口SendKeys
。但这听起来很详尽?有一个更好的方法吗?我不太了解,但我猜想使用多线程?有任何想法吗?
据我从您的帖子中了解到,您将消息发送到不属于您的应用程序的窗口。如果是这样,那么恐怕您必须在每次 SendKeys 调用之前检查活动窗口。
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);
}
}
编辑:哦。我错过了你没有“拥有”有问题的窗口。因此,下面的代码将不起作用。你需要继续做你正在做的事情。您总是可以在每个发送键之前调用 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);
}
}
我认为您必须在调用 SendKeys 之前检查以查看焦点,或者使用 OnGotFocus 和 OnLostFocus 跟踪自己的焦点。多线程在这里帮不了你——只有 GUI 线程可以与 GUI 交互。所以你可以有一个后台线程在工作,但它必须委托与 GUI 的任何交互。您可以通过在任何控件或窗口上调用 BeginInvoke 来执行此操作,它将在正确的线程中运行委托。