我已经编写了一个C#应用程序来从网络摄像头捕获图像。该应用程序使用win32 API调用,并且可以在我的win 10联想笔记本电脑上正常运行,并且可以与各种型号和操作系统(Win 7和Win 10)的联想笔记本电脑类似地工作。
当我尝试在带有集成摄像头的联想Thinkcenter上运行该应用程序时,出现黑屏(未引发任何异常)。 Win 10随附的Thinkcenter上的摄像头应用程序可以很好地工作,就像我安装的第3方应用程序一样可以正常运行,以验证摄像头可以正常运行,并且任何安全策略都不会阻止我的应用程序访问摄像头。
驱动程序(realtek)是最新的,我也尝试了通用Windows驱动程序,但是我的应用程序在此Thinkcenter PC上仍然给我黑屏。
led亮起,告诉我与硬件存在某种交互,但没有图像。
我还禁用了集成摄像头,并插入了USB摄像头,这可以正常工作。因此,无论问题出在哪里,似乎都是相机(和我的代码)所特有的。
作为Win32API编程的新手,我想知道如何解决此问题。如果有人有任何建议或指点,我将不胜感激。
public partial class Window1 : MetroWindow
{
IntPtr deviceHandle;
public const uint WM_CAP_DRIVER_CONNECT = 0x40a;
public const uint WM_CAP_SET_PREVIEW = 0x432;
public const uint WM_CAP_SET_PREVIEWRATE = 0x434;
public const uint WM_CAP_SET_SCALE = 0x435;
public const uint WS_CHILD = 0x40000000;
public const uint WS_VISIBLE = 0x10000000;
[DllImport("avicap32.dll")]
public extern static IntPtr capCreateCaptureWindow(string title, uint style, int x, int y, int width, int height, IntPtr window, int id);
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
public static extern IntPtr SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
[DllImport("user32.dll")]
extern static IntPtr GetClipboardData(uint uFormat);
public Window1()
{
InitializeComponent();
}
public void GetCamera()
{
deviceHandle = capCreateCaptureWindow(string.Empty, WS_VISIBLE | WS_CHILD, 0, 0, (int)ImgWebCam.Width, (int)ImgWebCam.Height, new WindowInteropHelper(this).Handle, 0);
if (SendMessage(deviceHandle, WM_CAP_DRIVER_CONNECT, (IntPtr)0, (IntPtr)0).ToInt32() > 0)
{
SendMessage(deviceHandle, WM_CAP_SET_SCALE, (IntPtr)(-1), (IntPtr)0);
SendMessage(deviceHandle, WM_CAP_SET_PREVIEWRATE, (IntPtr)0x42, (IntPtr)0);
SendMessage(deviceHandle, WM_CAP_SET_PREVIEW, (IntPtr)(-1), (IntPtr)0);
SetWindowPos(deviceHandle, new IntPtr(0), 0, 0, (int)ImgWebCam.Width, (int)ImgWebCam.Height, 6);
}
}
private void Start(object sender, RoutedEventArgs e)
{
//StartQRScanning();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
GetCamera();
}
}