HWND von einem Button?



  • Ich muss ein HWND von einem Buttom bekommen. Geht sowas?
    Ich muss das HWND einer Funktion übergeben, die einen
    Screenshot erstellen soll. Hier soll von einem Button
    der Screen gemacht werden. Oder geht das so nicht, wie
    ich mir das vorstelle? Wie kann ich sonst einen Screen
    von dem Steuerelement in meiner Anwendung machen?
    Nur indem ich die Koordinaten ermittel und den Screenshotbereich
    darauf ausrichte?

    HWND hwnd2;//muss auf idc_button1 zeigen ?!
    char *filename="c:\\testbild.bmp"; 
    HDC hdc=::GetDC(hwnd2); //
    DC2Bitmap(hdc, 1024, 768, filename); //auruf
    


  • Selbst wenn ich mit FindWindow arbeite bekomme ich keinen Screenshot
    von dem Window das ich angebe??

    HWND hwnd2;
    hwnd2=::FindWindow("Rechner",NULL);
    char *filename="c:\\testbild.bmp"; 
    HDC hdc=::GetDC(hwnd2); //
    DC2Bitmap(hdc, 1024, 768, filename); //auruf
    


  • hmm... sollte doch mit der CWnd Funktion GetSafeHWND zu machen sein.. ist ja davon abgeleitet...



  • Wie macht man sowas mit GetSafeHWND?



  • mit GetDlgItem bekommst du auch einen CWnd* auf den Button, da kriegst du dann dein Handle raus.



  • Meinst du etwas wie das?

    HWND hwnd2 = (HWND)GetDlgItem(IDC_BUTTON1);
    

    Da bekomme ich als Screenshot nur ein schwarzes Bild.
    Mache ich es so:

    HWND hwnd2= (HWND)::GetDlgItem(NULL,IDC_BUTTON1);
    

    Dann bekomme ich wieder den ganzen Desktop als Bild 😞

    Aber ich muss es doch an:

    HDC hdc=::GetDC(hwnd2);
    

    als HWND übergeben oder? Sonst erhalte ich ja:

    C2664: 'GetDC': Konvertierung des Parameters 1 von 'CWnd *' in 'HWND' nicht möglich

    😕



  • CWnd* pButton = GetDlgItem(ID_BUTTON);
    
    if (pButton)
    {
        CClientDC dc(pButton);
    }
    

    Das GetDlgItem hier ist die Membervariable einer CWnd-Klasse. Befindest du dich "im Dialog", wenn du das aufrufst?



  • Ja, richtig. Ich befinde mich im Dialog dessen Steuerelement den Fokus bekommen
    und als Screenshot gespeichert werden soll.

    Aber wie ich das in das benötigte HWND überführen soll habe ich noch
    nicht so wirklich verstanden. Dank für dein Bemühen!



  • brauchst du doch nicht. Kopier meinen Quellcode von oben drüber. Benutz die Klasse CClientDC anstatt dir selber ein Handle auf einen DeviceContext zu holen.



  • Juhu, so gehts!

    Nur noch eine Frage...

    Wenn ich ein Fenster mit FindWindow suche und dann einen Screen davon
    erstellen will, geht dies ja nur, wenn das Fenster den Fokus hat.
    Also weder minimiert ist, noch überlagert wird.

    Ich habe schon versucht mit SetForegroundWindow und SetSocus bzw.
    ShowWindow das minimierte bzw. überlagerte Fenster zu "knippsen".
    Es geht allerdings nicht. Ich bekomme nur den Screenshot von den aktiven Fenstern.

    HWND hWnd =::FindWindow(NULL,"Rechner");
    //will alles nicht gehen. Fenster zwar dann im Vordergrund, aber wird nicht mit geknippst....
    ::SetForegroundWindow(hWnd);
    ::SetActiveWindow(hWnd);
    ::SetFocus(hWnd);
    

    Wie soll ich das sonst noch versuchen? Nie wird das fenster erwischt...



  • Hmm.. poste mal den Code, mit dem du Screenshots machst.. kann sein das ich momentan nen Black Out hab.. aber vllt findet man ihn dann 😉


Anmelden zum Antworten