SendKeys.Send功能不起作用

时间:2013-05-14 12:25:43

标签: c# sendkeys

我想在某些事件上按Shift + Tab,我为此目的使用System.Windows.Forms.SendKeys.Send但它无法正常工作,我尝试了以下方法来调用该函数。

 System.Windows.Forms.Application.DoEvents();
                SendKeys.Send("{+(Tab)}");

 System.Windows.Forms.Application.DoEvents();
                SendKeys.Send("+{Tab}");

 System.Windows.Forms.Application.DoEvents();
                SendKeys.Send("{+}{Tab}");

 System.Windows.Forms.Application.DoEvents();
                SendKeys.Send("+{Tab 1}");

有人能告诉我什么是正确的方法吗?

2 个答案:

答案 0 :(得分:2)

正确的语法是:

SendKeys.Send("+{Tab}");

根据您的评论,您试图按Shift+Tab来控制字段之间的循环,请注意,这可以更加可靠地完成,而无需模拟密钥。这避免了例如另一个窗口具有焦点的问题。

<击> 以下方法将模拟Shift_Tab的行为,以相反的顺序循环切换制表位:

void EmulateShiftTab()
{
    // get all form elements that can be focused
    var tabcontrols = this.Controls.Cast<Control>()
            .Where(a => a.CanFocus)
            .OrderBy(a => a.TabIndex);

    // get the last control before the current focused element
    var lastcontrol =
            tabcontrols
            .TakeWhile(a => !a.Focused)
            .LastOrDefault(a => a.TabStop);

    // if no control or the first control on the page is focused,
    // select the last control on the page 
    if (lastcontrol == null)
           lastcontrol = tabcontrols.LastOrDefault();

    // change focus to the proper control
    if (lastcontrol != null)
           lastcontrol.Focus();
}

<击>

修改

删除的文本将以相反的顺序循环控制(模拟shift + Tab),但使用内置的Form.SelectNextControl方法可以更好地完成此操作。以下方法将模拟Shift_Tab的行为,以相反的顺序循环切换制表符。

void EmulateShiftTab()
{
    this.SelectNextControl(
        ActiveControl,
        forward: false,
        tabStopOnly:true, 
        nested: true, 
        wrap:true);
}

答案 1 :(得分:0)

它不执行任何操作或将输入发送到您不想编辑的控件中吗?检查是否首先调用此代码,并且不要忘记在SendKeys之前手动关注目标控件,以确保它将收到您的密钥。