Преобразование панели 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 ответа:
Вы должны быть осторожны, чтобы не подвергать принципиально неуправляемые типы, такие как 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();