0

と を含むユーザー コントロールがOpenFileDialogありPictureBoxます。ユーザーが他の情報とともに画像を選択して保存できる編集可能なフォームで使用します。私が遭遇した問題は、設定する必要がありopenFileDialog.Filter、この Filter は実際には myTextBoxという名前の値ですtxtCode

txtCode.TextForm_loadイベントで を渡しますが、これでは十分ではありません。TextBoxユーザーが を開こうとしたときにから値を取得する必要がありますFile Dialog。私はそれを次のように使用するためUser Control

ここに画像の説明を入力

したがって、ボタンクリックイベントをキャッチできません。File Browse実際には、ボタンの外側のどこかをクリックすると発生するユーザーコントロールのクリックイベントしか処理できずPictureBox、イベントを処理して送信者がButton.

txtCode.Textが開かれたとき、OpenFileDialogまたは少なくとも非常に近い瞬間に値を渡して、最新の値を操作できるようにするにはどうすればよいですか?

4

2 に答える 2

1

background threadを開く直前にを開始しOpenFIleDialogます。バックグラウンド スレッドで、使用可能なファイルを開くダイアログ ボックスを検索し、ファイル名の値を設定します。開くボタンを自動的にクリックすることもできます。これを行うには、.net で使用できる Windows API があります。

FindWindow のサンプル:

**Calling Code:**

Thread thread2 = new Thread(new ThreadStart(MyClass.SelectFile));
thread2.IsBackground = true;
thread = thread2;
thread.Start();


**Class Code:**

[DllImport("user32.dll", SetLastError=true)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll", EntryPoint="FindWindow", SetLastError=true)]
private static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

[DllImport("user32.dll", CharSet=CharSet.Auto, SetLastError=true)]
private static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string lclassName, string windowTitle);

public void SelectFile(string filename)
{
    Thread.Sleep(0x3e8);
    IntPtr zero = IntPtr.Zero;
    IntPtr parentHandle = IntPtr.Zero;
    IntPtr child = new WinAPI(Process.GetCurrentProcess().MainWindowHandle, "#32770").GetChild();
    while (child == IntPtr.Zero)
    {
        Application.DoEvents();
    }
    if (child != IntPtr.Zero)
    {
        zero = child;
        parentHandle = FindWindowEx(zero, IntPtr.Zero, "ComboBoxEx32", "");
        if (parentHandle != IntPtr.Zero)
        {
            parentHandle = FindWindowEx(parentHandle, IntPtr.Zero, "ComboBox", "");
            if (parentHandle != IntPtr.Zero)
            {
                parentHandle = FindWindowEx(parentHandle, IntPtr.Zero, "Edit", "");
                if (parentHandle != IntPtr.Zero)
                {
                    SendMessage(parentHandle, 12, IntPtr.Zero, fileName);
                    parentHandle = FindWindowEx(zero, IntPtr.Zero, "Button", "&Open");
                    if (!(parentHandle == IntPtr.Zero))
                    {
                        SendMessage(parentHandle, 0xf5, IntPtr.Zero, "");
                    }
                }
            }
        }
    }
    Thread.Sleep(0x7d0);
}
于 2013-03-05T13:54:41.953 に答える
0

txtCode.Textフォームのどこでも使用できます。Form_Loadハンドラーだけではありません。必要なところだけ使ってみてください。

于 2013-03-05T13:39:16.027 に答える