C #: Как открыть конфигурацию Pin Dialog? - PullRequest
0 голосов
/ 13 января 2011

Я хочу знать, какой процесс запустить с

 System.Diagnostics.Process.Start("", "");

, которые открывают этот диалог. Спасибо alt text Это диалоговое окно происходит из проекта прямой трансляции кодировщика MS Expression, Config pin Dialog выбранного устройства. alt text

Ответы [ 4 ]

4 голосов
/ 13 января 2011

Этот диалог не является отдельным исполняемым файлом, который вы можете просто запустить с помощью System.Diagnostics.Process.Start. Это диалоговое окно конфигурации вашего устройства захвата. Ваше устройство захвата представлено как устройство захвата DirectShow. Это устройство является COM-объектом, который реализует ISpecifyPropertyPages , откуда и происходит конкретный экран, на который вы смотрите. Здесь - статья MSDN о том, как отобразить страницу свойств фильтра DirectShow.

2 голосов
/ 11 января 2012

Если вы используете Expression Encoder SDK 4, вы можете отобразить это диалоговое окно и другие окна конфигурации следующим образом:

 LiveDeviceSource _deviceSource;   
 ....
 if (_deviceSource.IsDialogSupported(ConfigurationDialog.VideoCapturePinDialog))
 {              
       _deviceSource.ShowConfigurationDialog(ConfigurationDialog.VideoCapturePinDialog, (new HandleRef(panelVideoPreview, panelVideoPreview.Handle)));
 }

Вы можете увидеть все поддерживаемые диалоговые окна конфигурации, изучив тип Microsoft.Expression.Encoder.Live.ConfigurationDialog.

1 голос
/ 06 августа 2013

Использование функции LiveDeviceSource.ShowConfigurationDialog из Expression Encoder SDK обычно является хорошим выбором.В моем случае, однако, у меня были некоторые источники захвата, которые не могли быть должным образом созданы Expression Encoder, если они неправильно настроены.Чтобы настроить их правильно, мне нужны их диалоговые окна конфигурации.Итак, я собрал это решение, используя DirectShow.NET :

/// <summary>
/// Retrieves the IBaseFilter with the requested name
/// </summary>
/// <param name="deviceName">The friendly name of the device to retrieve</param>
/// <param name="deviceType">The type of device to retrieve</param>
/// <returns>Returns the filter with the given friendly name, or null if no such filter exists</returns>
public static IBaseFilter GetDeviceFilterByName(string deviceName, EncoderDeviceType deviceType)
{
    int hr = 0;
    IEnumMoniker classEnum = null;
    IMoniker[] moniker = new IMoniker[1];

    // Create the system device enumerator
    ICreateDevEnum devEnum = (ICreateDevEnum)new CreateDevEnum();

    // Create an enumerator for the video or audio capture devices
    if (deviceType == EncoderDeviceType.Audio)
    {
        hr = devEnum.CreateClassEnumerator(FilterCategory.AudioInputDevice, out classEnum, 0);
    } else
    {
        hr = devEnum.CreateClassEnumerator(FilterCategory.VideoInputDevice, out classEnum, 0);
    }

    DsError.ThrowExceptionForHR(hr);
    Marshal.ReleaseComObject(devEnum);

    // no enumerators for video/audio input devices
    if (classEnum == null)
    {
        return null;
    }

    IBaseFilter foundFilter = null;
    // enumerate all input devices, looking for one with the desired friendly name
    while(classEnum.Next(moniker.Length, moniker, IntPtr.Zero) == 0)
    {
        Guid iid = typeof(IPropertyBag).GUID;
        object props;
        moniker[0].BindToStorage(null, null, ref iid, out props);
        object currentName;
        (props as IPropertyBag).Read("FriendlyName", out currentName, null);

        if ((string)currentName == deviceName)
        {
            object filter;
            iid = typeof(IBaseFilter).GUID;
            moniker[0].BindToObject(null, null, ref iid, out filter);
            foundFilter = (IBaseFilter)filter;

            Marshal.ReleaseComObject(moniker[0]);
            break;
        }
        Marshal.ReleaseComObject(moniker[0]);
    }

    Marshal.ReleaseComObject(classEnum);
    return foundFilter;
}

/// <summary>
/// Opens the property pages for the filter with the given name
/// </summary>
/// <param name="filter">The filter for which we wish to retrieve and open the property pages</param>
public static void ShowDevicePropertyPages(IBaseFilter filter, IntPtr handle)
{
    // get the ISpecifyPropertyPages for the filter
    ISpecifyPropertyPages pProp = filter as ISpecifyPropertyPages;
    int hr = 0;
    if (pProp == null)
    {
        // if the filter doesn't implement ISpecifyPropertyPages, try displaying IAMVfwCompressDialogs instead
        IAMVfwCompressDialogs compressDialog = filter as IAMVfwCompressDialogs;
        if (compressDialog != null)
        {
            hr = compressDialog.ShowDialog(VfwCompressDialogs.Config, IntPtr.Zero);
            DsError.ThrowExceptionForHR(hr);
        }
        return;
    }

    // get the name of the filter from the FilterInfo struct
    FilterInfo filterInfo;
    hr = filter.QueryFilterInfo(out filterInfo);
    DsError.ThrowExceptionForHR(hr);

    // get the propertypages from the property bag
    DsCAUUID caGUID;
    hr = pProp.GetPages(out caGUID);
    DsError.ThrowExceptionForHR(hr);

    // create and display the OlePropertyFrame
    object[] oDevice = new[] {(object)filter};
    hr = OleCreatePropertyFrame(handle, 0, 0, filterInfo.achName, 1, oDevice,
                                caGUID.cElems, caGUID.ToGuidArray(), 0, 0, 0);
    DsError.ThrowExceptionForHR(hr);

    // release COM objects
    Marshal.FreeCoTaskMem(caGUID.pElems);
    Marshal.ReleaseComObject(pProp);
    if (filterInfo.pGraph != null)
    {
        Marshal.ReleaseComObject(filterInfo.pGraph);
    }
}

[DllImport("oleaut32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
static extern int OleCreatePropertyFrame(IntPtr hwndOwner,
    int x,
    int y,
    [MarshalAs(UnmanagedType.LPWStr)] string lpszCaption,
    int cObjects,
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4, ArraySubType = UnmanagedType.IUnknown)] object[] lplpUnk,
    int cPages,
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 6)] Guid[] lpPageClsID,
    int lcid,
    int dwReserved,
    int lpvReserved);

Использование:

var device = GetDeviceFilterByName(_settingsViewModel.VideoEncoderDevice.Name, EncoderDeviceType.Video);
ShowDevicePropertyPages(device, new HandleRef(ConfigurationDialogHost, 
                    ConfigurationDialogHost.Handle).Handle);
1 голос
/ 13 января 2011

Нет программы, которую вы можете запустить с этой строкой, чтобы вызвать этот диалог. (Если, конечно, вы не сделаете один).

...