The Magical Magikarp Ответов: 1

Как заставить форму ждать, пока диалоговое окно свойств не будет закрыто? С#


Привет! Я создаю приложение типа проводника, и все шло хорошо - пока я не понял, что мне нужно добавить меню свойств..

Итак, я использовал этот код:

[DllImport("shell32.dll", CharSet = CharSet.Auto)]
static extern bool ShellExecuteEx(ref SHELLEXECUTEINFO lpExecInfo);

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct SHELLEXECUTEINFO
{
    public int cbSize;
    public uint fMask;
    public IntPtr hwnd;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string lpVerb;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string lpFile;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string lpParameters;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string lpDirectory;
    public int nShow;
    public IntPtr hInstApp;
    public IntPtr lpIDList;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string lpClass;
    public IntPtr hkeyClass;
    public uint dwHotKey;
    public IntPtr hIcon;
    public IntPtr hProcess;
}

private const int SW_SHOW = 5;
private const uint SEE_MASK_INVOKEIDLIST = 12;
public static bool ShowFileProperties(string Filename)
{
    SHELLEXECUTEINFO info = new SHELLEXECUTEINFO();
    info.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(info);
    info.lpVerb = "properties";
    info.lpFile = Filename;
    info.nShow = SW_SHOW;
    info.fMask = SEE_MASK_INVOKEIDLIST;
    return ShellExecuteEx(ref info);        
}


Теперь он работает для отображения свойств файлов, но позволяет пользователю возобновить фокус с исходной формой.

Как я могу дать меню свойств, которое открывается кодом при условии того же поведения, что и ShowDialog()?

Краткое изложение моего вопроса:

Как сделать так, чтобы родительская форма приостановилась до тех пор, пока не появится форма свойств, которая открывается с помощью приведенного выше кода, как это было бы, если бы я открыл универсальную форму с помощью ShowDialog()?

Спасибо :)

Что я уже пробовал:

Я предоставил код выше - я действительно не знаю, что нужно изменить, чтобы добавить желаемое поведение.

Richard Deeming

NB: Окно свойств не является модальным в Проводнике Windows. Если вы пытаетесь имитировать поведение проводника, вам не следует делать окно свойств модальным. :)

1 Ответов

Рейтинг:
2

OriginalGriff

Почему вы, используя функцию shellexecute, а не процесс? Класс Process имеет метод WaitForExit и не требует обтекания с помощью Shell32.dll вообще ...


The Magical Magikarp

Как бы я использовал процесс для открытия диалогового окна свойств? Спасибо :)