2013-04-16 8 views
7

Ich verwende nicht verwaltete Bibliotheken, um Videostreams von IP-Kamera zu erhalten. Es Funktion ist:Winform-Steuerelementgröße kann nicht in nicht verwalteten Code übergeben werden.

[DllImport("client.dll", EntryPoint = "Network_ClientStartLive", SetLastError = true)] 
protected static extern int Network_ClientStartLive(
     ref IntPtr pStream, 
     IntPtr hDev, 
     IntPtr pClientInfo, 
     [MarshalAs(UnmanagedType.FunctionPtr)] ReadDatacbf lpfnCallbackFunc = null, 
     UInt32 dwUserData = 0 
    ); 

Die pClientInfo ist ein Zeiger auf Strukturtyp:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
protected struct LiveConnect 
{ 
    public UInt32 dwChannel; 
    public IntPtr hPlayWnd; 
    public UInt32 dwConnectMode; 
} 

wo hPlayWnd ist ein Handgriff des Fensters, in dem Videostrom ausgegeben werden muß. Die Bibliothek erkennt die Videoauflösung anhand der Größe dieses Fensters (während des Aufrufs an Network_ClientStartLive). Ich überprüfte es auf C++ MFC-Programm, wo Ausgabefenster ist Picture control und durch Festlegen der Größe mit Methode MoveWindow wurde Ausgabe Videoauflösung definiert.

In der C# Version dieses Programms verwende ich eine PictureBox -control, um den Video-Stream zu zeichnen. Das Video wird angezeigt, aber die Größe des PictureBox hat keine Auswirkungen auf die Auflösung des Videostreams. Ich habe versucht, verschiedene Methoden PictureBox Größe zu ändern:

  1. pictureBox.Size
  2. Einstellung WinAPI mit SetWindowPos:
 
[DllImport("user32.dll")] 
private static extern bool SetWindowPos(
    IntPtr hWnd, 
    IntPtr hWndInsertAfter, 
    int x, 
    int y, 
    int width, 
    int height, 
    uint uFlags); 

Bei beiden Verfahren die Größe der Steuerung geändert wurde, aber die Kamera Bibliothek fortgesetzt Ausgang Videostream in maximaler Auflösung.

Wie kann ich dieses Problem lösen?

Danke!

+0

Ich kann nicht an einen Fehlermodus denken, es gibt nichts grundsätzlich anders zwischen einer .NET PictureBox und einem nicht verwalteten Bild Steuerelement, soweit nicht verwalteten Code jemals kümmern oder sehen würde. Bedenken Sie die Möglichkeit, dass Sie den falschen Fenstergriff übergeben. Wie die des Formulars oder des Desktops (null). Wenden Sie sich an den Bibliothekshersteller oder -autor, um Unterstützung zu erhalten. Sie können dies problemlos beheben. –

+6

Ich vermute auch, dass der Griff falsch ist. Schreiben Sie das übergebene Handle in ein Protokoll und verwenden Sie während der Ausführung der Anwendung das Dienstprogramm Spy ++, um die Bildbox auszuwählen. Wenn das Handle Spy ++ nicht mit dem Handle übereinstimmt, das Sie geloggt haben, wissen Sie, dass etwas nicht funktioniert. – dazedandconfused

Antwort

1

Jedes Steuerelement in Windows Forms hat ein SizeChanged (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.sizechanged(v=vs.110).aspx) Ereignis. Vielleicht ist es möglich, Code hinzuzufügen, um die Videoauflösung in diesem Event-Handler manuell zu ändern? Wenn nicht, sendet das von Ihnen angegebene PictureBox-Handle möglicherweise keine WM_SIZE-Nachrichten, für die die nicht verwaltete Bibliothek suchen würde. Wie in einem der Kommentare erwähnt, wäre Spy ++ (in Visual Studio enthalten) ein nützliches Programm, um die Nachrichten zu überwachen und sicherzustellen, dass die Handle-Werte und die Ereignisse so sind, wie Sie es erwarten.

Verwandte Themen