Преобразование панели windows c# в c HWND


У меня есть dll, которая принимает HWND, (код в dll);

void VideoCapture::SetVideoWindow(HWND VidWind)
{
    VideoWindow = VidWind;
}

Я вызываю вышеупомянутую dll в образце c#.net применение путем добавления библиотеки dll в ссылки, в c#.net у меня есть форма с панелью, можно ли передать эту панель в dll? я дал код, как показано ниже в c#

VidCapWrapper.ManagedVideoCapture cc = new VidCapWrapper.ManagedVideoCapture();

cc.SetVideoWindow( panel1);

Я получаю ошибки, как показано ниже: Ошибка 2 лучший перегруженный метод соответствует для " VidCapWrapper.Удалось его поймать.SetVideoWindow (HWND_ _ ) ' имеет некоторые недопустимые аргументы D:DirectShow_Capture_GUIDirectShow_Capture_GUIForm1.cs 44 13 DirectShow_Capture_GUI Ошибка 3 Аргумент 1: не удается преобразовать из ' System.Окна.Формы.Панель ' to ' HWND_ _ ' D:DirectShow_Capture_GUIDirectShow_Capture_GUIForm1.cs 44 32 DirectShow_Capture_GUI '

Может ли кто-нибудь, пожалуйста, сказать мне, как передать панель в dll, (любой пример будет хорошим)? (извините, я очень новичок в .net, но пытаюсь создать пример приложения, которое показывает доступные устройства, такие как встроенная веб-камера... и затем показывает предварительный просмотр на c#.net панель формы)

EDIT : Благодаря @Blachshma и @Ганс между прочим, теперь я могу переходить на C# для Windows, форма панели с моей DLL-библиотеки C++.

Я изменил свой func в dll как

void VideoCapture::SetVideoWindow(IntPtr windowHandle)
{
    VideoWindow = (HWND)windowHandle.ToPointer();
}

И в c# я называю это как куб.см.SetVideoWindow (панель 1.Ручка);

2 3
c#

2 ответа:

Вы должны быть осторожны, чтобы не подвергать принципиально неуправляемые типы, такие как HWND, c# - коду. Компилятор C# не позволит вам передать значение такого типа. Правильный тип взаимодействия здесь-IntPtr, он может хранить значение дескриптора. Поэтому сделайте свой метод C++ / CLI следующим образом:

void VideoCapture::SetVideoWindow(IntPtr windowHandle)
{
    VideoWindow = (HWND)windowHandle.ToPointer();
}

Теперь вы можете просто пройти panel1.Дескриптор к методу, также типа IntPtr.

Панель имеет свойство Handle, которое можно использовать:

Panel p = new Panel();
IntPtr handle = p.Handle;

Этого должно быть достаточно, если вы установите подпись SetVideoWindow, чтобы разрешить IntPtr т. е.

void VideoCapture::SetVideoWindow(IntPtr VidWind)

Если вы должны использовать HWND, вам нужно будет использовать небезопасно контекст, и бросьте его так:

HWND hwnd=(HWND)this.Handle.ToPointer();

Вот ссылка с дополнительной информацией