0

我有用户控件,包括OpenFileDialogPictureBox。我以可编辑的形式使用它,允许用户选择和保存图像以及其他信息。我遇到的问题是我需要设置openFileDialog.Filter,而这个过滤器实际上是一个 my 的值,TextBox它被命名为txtCode

现在我传递了txtCode.TextonForm_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 回答