Laden...

Handle des Konsolenfensters ermitteln

Erstellt von CutePro vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.556 Views
C
CutePro Themenstarter:in
20 Beiträge seit 2010
vor 13 Jahren
Handle des Konsolenfensters ermitteln

Hallo,

ich will ein WebCam-Bild schießen hie erstmal der gesamte Code:


[DllImport("user32", EntryPoint = "SendMessage")]
        public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);

        [DllImport("avicap32.dll", EntryPoint = "capCreateCaptureWindowA")]
        public static extern int capCreateCaptureWindowA(string lpszWindowName, int dwStyle, int X, int Y, int nWidth, int nHeight, int hwndParent, int nID);

        [DllImport("user32", EntryPoint = "OpenClipboard")]
        public static extern int OpenClipboard(int hWnd);

        [DllImport("user32", EntryPoint = "EmptyClipboard")]
        public static extern int EmptyClipboard();

        [DllImport("user32", EntryPoint = "CloseClipboard")]
        public static extern int CloseClipboard();

        [DllImport("user32.dll")]
        static extern int GetForegroundWindow(); 

        public const int WM_USER = 1024;

        public const int WM_CAP_CONNECT = 1034;
        public const int WM_CAP_DISCONNECT = 1035;
        public const int WM_CAP_GET_FRAME = 1084;
        public const int WM_CAP_COPY = 1054;

        public const int WM_CAP_START = WM_USER;

        public const int WM_CAP_DLG_VIDEOFORMAT = WM_CAP_START + 41;
        public const int WM_CAP_DLG_VIDEOSOURCE = WM_CAP_START + 42;
        public const int WM_CAP_DLG_VIDEODISPLAY = WM_CAP_START + 43;
        public const int WM_CAP_GET_VIDEOFORMAT = WM_CAP_START + 44;
        public const int WM_CAP_SET_VIDEOFORMAT = WM_CAP_START + 45;
        public const int WM_CAP_DLG_VIDEOCOMPRESSION = WM_CAP_START + 46;
        public const int WM_CAP_SET_PREVIEW = WM_CAP_START + 50;

        private int m_Width = 320;
        private int m_Height = 240;
        private int mCapHwnd;

        private System.Windows.Forms.IDataObject tempObj;
        private System.Drawing.Image tempImg;

public void doImage()
        {
            IntPtr handle = Process.GetCurrentProcess().MainWindowHandle;
            Application.DoEvents();
            SendMessage(mCapHwnd, WM_CAP_DISCONNECT, 0, 0);
            mCapHwnd = capCreateCaptureWindowA("WebCap", 0, 0, 0, m_Width, m_Height, this.Handle.ToInt32() , 0);
            Application.DoEvents();
            SendMessage(mCapHwnd, WM_CAP_CONNECT, 0, 0);
            SendMessage(mCapHwnd, WM_CAP_SET_PREVIEW, 0, 0);
            SendMessage(mCapHwnd, WM_CAP_GET_FRAME, 0, 0);
            SendMessage(mCapHwnd, WM_CAP_COPY, 0, 0);

            tempObj = Clipboard.GetDataObject();
            tempImg = (System.Drawing.Bitmap)tempObj.GetData(System.Windows.Forms.DataFormats.Bitmap);

            Image WebCamImage = tempImg.GetThumbnailImage(m_Width, m_Height, null, System.IntPtr.Zero);
        }

Es geht mir jetzt um


            mCapHwnd = capCreateCaptureWindowA("WebCap", 0, 0, 0, m_Width, m_Height, this.Handle.ToInt32() , 0);

Alles funktioniert super in einer Windows-Forms-Anwendung, aber in der Konsole nicht, da es this nicht gibt. Also brauche ich ein Ersatz für das Handle.

Ausprobiert habe ich schon


IntPtr handle = Process.GetCurrentProcess().MainWindowHandle;

Aber es klappt nicht.

Über Hilfe wäre ich erfreut.

Gruß & frohes Silvester + guten Rutsch
Ich 😃

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo CutePro,

SendMessage funktionert bei WinForms nicht, da die UI nicht nativ ist. Die Controls bei WinForms haben zwar einen Handle, aber es funktioniert nicht. Möchtest du trozdem auf die UI zugreifen, muss du mit UI Automation arbeiten.

Das, was du vor hast, ist wirklich die schlechteste Idee. Auf Seiten wie z.B. CodePlex oder CodeProject findest du fertige APIs für Webcams. Damit kannst du einfach und bequem mithilfe der API Bilder schießen.

Warum also so kompliziert?

zero_x

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo CutePro,

mit der Win32 Funktion EnumWindows sollte man auch an den Handle eines Konsolen-Fensters kommen.

herbivore

1.130 Beiträge seit 2007
vor 13 Jahren

SendMessage funktionert bei WinForms nicht, da die UI nicht nativ ist. Die Controls bei WinForms haben zwar einen Handle, aber es funktioniert nicht.

😁 Du bist mir lustig. Winforms controls sind nur hüllen um die nativen controls. Und sendmessage geht sehr wohl!!!

Allerdings werden die messages durch überschreiben jeder einzelnen messageprozedur abgefangen anstatt nur die des hauptfensters zu überschreiben. man muss also direkt die meldungen senden, anstatt WM_COMMAND an das hauptfenster zu senden. Das ist allerdings eher noch einfacher als WM_COMMAND zu verwenden^^

Allerdings gibt es tatsächlich ein problem: Das ab windows vista eingebaute sicherheitsfeature UIPI.

In jedem falle funktioniert sendmessage für winforms-controls aber genauso wie für native!

Jetzt schreib ich aber auch mal, wie man an das consolen-handle kommt:
http://www.pinvoke.net/default.aspx/kernel32.getconsolewindow

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!