8

C#でWindowsフォームを使用しています。

toolStripButtonsを含むいくつかのツールバーを備えたメインフォームがあります。データを含む別のフォームを操作した後、メインフォームはフォーカスを失い、toolStripButtonをクリックしてもOnClickイベントはトリガーされません。最初のクリックでメインフォームがアクティブになり、2回目のクリックで実際にボタンが押されます。Clickイベントをトリガーするためにユーザーがボタンを1回だけクリックする必要がありますが、その方法について何かアイデアはありますか?ありがとう。

ノート:

  • 私はMDIを使用していましたが、親のフォームボタンをクリックしても問題はありませんでした。しかし今、最も重要なのは、フォームを複数のディスプレイに自由に浮かせることです。
  • ワーカーフォームにはOwnerプロパティとしてメインフォームがあり、このようにしてメインフォームの上に留まります。
  • 非アクティブなフォームのボタンをクリックしても、MouseHover、MouseEnter、MouseDown、MouseUpのいずれも起動しません。発生するのは、メインフォームのActivateイベントです。
  • メインフォームには、treeView(tabControl内、splitContainer内、パネル内)があります。メインフォームが非アクティブであっても、そのアイテムは最初のマウスクリックで選択されます。すべてのコントロールが同じというわけではないと思います!
4

2 に答える 2

10

行う必要があるのは、を継承ToolStripして処理するクラスを作成することWndProcです。これはそれを行う1つの方法です。他にもあります。

private class MyToolStrip : ToolStrip
{
    private const uint WM_LBUTTONDOWN = 0x201;
    private const uint WM_LBUTTONUP   = 0x202;

    private static bool down = false;

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_LBUTTONUP && !down)
        {
            m.Msg = (int)WM_LBUTTONDOWN;
            base.WndProc(ref m);
            m.Msg = (int)WM_LBUTTONUP;
        }

        if (m.Msg == WM_LBUTTONDOWN) down = true;
        if (m.Msg == WM_LBUTTONUP)   down = false;
        base.WndProc(ref m);
    }
}

私もこの解決策を見ました:

protected override void WndProc(ref Message m)
{
    // WM_MOUSEACTIVATE = 0x21
    if (m.Msg == WM_MOUSEACTIVATE && this.CanFocus && !this.Focused)
        this.Focus();
    base.WndProc(ref m);
}

私が最後に働いた場所でこれに遭遇しました。私が思いついた解決策は後者のように機能したと思いますが、使用した正確なコードにアクセスできません。

于 2011-08-04T19:35:46.510 に答える
-4

境界線のないフォームがある場合、このロジックは組み込みで機能していました:)

form.FormBorderStyle = FormBorderStyle.None
于 2014-02-10T13:52:38.593 に答える