1

如果我的表单,我只想清除剪贴板文本LostFocus。我的意思是,如果用户使用他的键盘或鼠标复制某些东西,必须在LostFocus事件中清除它,那么如果我的表单再次获得焦点,我需要取回我的文本。我怎样才能做到这一点?

string sValue = "";
public Form1()
{
    InitializeComponent();
    this.LostFocus += new EventHandler(Form1_LostFocus);
    this.GotFocus += new EventHandler(Form1_GotFocus);
}

void Form1_GotFocus(object sender, EventArgs e)
{
    Clipboard.SetText(sValue);
    textBox1.Text = Clipboard.GetText();
}

void Form1_LostFocus(object sender, EventArgs e)
{
    sValue = textBox1.Text;
    Clipboard.Clear();
}

这不起作用;事件LostFocus被调用,但GotFocus没有被调用。我该如何解决这个问题?

4

2 回答 2

5

为了给你一个快速的答案,而不是将事件处理程序添加到表单本身,将它们添加到TextBox控件中:

textBox1.LostFocus += new EventHandler(Form1_LostFocus);
textBox1.GotFocus += new EventHandler(Form1_GotFocus);

如果表单包含任何可见控件,它将永远不会触发GotFocusLostFocus事件。

但是在表单级别处理此行为的推荐方法是使用:

this.Deactivate += new EventHandler(Form1_LostFocus);
this.Activated += new EventHandler(Form1_GotFocus);

或者

textBox1.Leave += new EventHandler(Form1_LostFocus);
textBox1.Enter += new EventHandler(Form1_GotFocus);

微软说:

  1. 对于Control.GotFocus 事件

    GotFocus 和 LostFocus 事件是与 WM_KILLFOCUS 和 WM_SETFOCUS Windows 消息相关联的低级焦点事件。通常,GotFocus 和 LostFocus 事件仅在更新 UICues 或编写自定义控件时使用。相反,Enter 和 Leave 事件应用于除 Form 类之外的所有控件,Form 类使用 Activated 和 Deactivate 事件。

  2. 对于Form.Activated 事件

    当应用程序处于活动状态并具有多个表单时,活动表单是具有输入焦点的表单。不可见的表单不能是活动表单。激活可见表单的最简单方法是单击它或使用适当的键盘组合。

  3. 对于Control.Enter 事件

    Enter 和 Leave 事件被 Form 类抑制。Form 类中的等效事件是 Activated 和 Deactivate 事件。

于 2013-01-16T11:39:43.167 回答
0
    string sVal = "";
    public Form1()
    {
        InitializeComponent();
        this.Activated += new EventHandler(Form1_GotFocus);
        this.Deactivate += new EventHandler(Form1_LostFocus);

    }

    void Form1_LostFocus(object sender, EventArgs e)
    {
        sVal = Clipboard.GetText();
        Clipboard.Clear();
    }

    void Form1_GotFocus(object sender, EventArgs e)
    {
        Clipboard.SetText(sVal);
    }
于 2013-01-16T12:10:43.887 回答