ListControl Fokus setzen



  • Ich habe ein Problem mit einem ListControl und dem Setzen eines Fokus darauf,
    nachdem ich in einem ActiveX ein PDF habe anzeigen lassen.

    Das PDF-Objekt erhält den Fokus und es ist mir irgendwie nicht mehr
    möglich nach dem .LoadFile(pdfname); den Fokus auf das ListControl
    zurück zu setzen, um mit den Pfeiltasten zur nächsten Datei zu navigieren.
    Es ist immer erst ein Mausklick auf das ListControl notwendig.

    Ich habe folgenden Teilcode dafür:

    LPNMLVKEYDOWN pLVKeyDow = reinterpret_cast<LPNMLVKEYDOWN>(pNMHDR);
    	// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
    CString auswahl = droplist;
    
    	int CurSel=0;
    	for(int i=0;i<list1.GetItemCount();i++)
    	{
    		if((list1.GetItemState(i,LVIS_SELECTED)& LVIS_SELECTED)==LVIS_SELECTED)
    		{
    			CurSel=i;
    			break;
    		}
    	}
    
    	CString text = list1.GetItemText(CurSel,0);
    	auswahl+=text;
    	auswahl+=".pdf";
    
    	mpdf.LoadFile(auswahl);
    
    GetDlgItem(IDC_LIST2)->SetFocus();
    


  • Ich habe es jetzt nochmal so versucht, aber mit dem gleichen
    Ergebnis:

    ((CButton*)GetDlgItem(IDC_LIST2))->SetFocus();
    

    Der Fokus bleibt auf dem Adobe Reader ActiveX 😞



  • Du kannst erst wieder den Fokus auf ein Element setzen, wenn die Anwendung selbst (also auch der Dialog) wieder aktiv ist.



  • Hi Tester2,
    meinst du damit, dass der Dialog quasi nicht mehr aktiv ist, da das
    ActiveX innerhalb des Dialoges irgendwie den Fokus "schluckt"?

    Dann müsste ich praktisch sowas wie FindWindow auf den ganzen Dialog
    anwenden und mit SetForergroundWindow o.ä. den Dialog nochmals aktivieren
    um anschließend mit FindWindow das child (also das ListControl) zu suchen
    und ihm dann wieder den Fokus zu geben?


  • Mod

    Evtl. ist es ganz anders und der Focus landet erst in dem ActiveX Control nachdem Dein ganzer Code ausgeführt wird. HTML/Browser Contrls machen das auch gern.

    Prüfe das mal mit Spy++.



  • Hallo Martin,
    ja so ist es, der Code wird durchlaufen und danach landet der Eingabefokus
    im ActiveX. Nur ich bekomme den Fokus nicht vernünftig zurück gesetzt.
    Zumindest habe ich keine Idee in welcher Funktion ich abprüfen soll, ob der
    Fokus auf dem ActiveX gelandet ist. Wäre da ein thread nicht etwas "oversized"?
    Aber das ist momentan das einizige was mir da einfallen würde 😞


  • Mod

    Einfach PostMessage mit einer eigenen Nachricht. Diese wird ja erst abgehandelt, wenn die Message-Pump wieder anläuft. Dann setzt Du den Fokus zurück.

    Ich habe diese Technik für ein HTML Control hier in meinem Blog schon mal erklärt:
    http://blog.m-ri.de/index.php/2009/04/15/das-web-browser-control-stiehlt-den-fokus-wenn-ein-dokument-geladen-wurde/



  • Hallo Martin,

    ich bin mir nicht sicher in welcher Funktion ich für das Adobe Reader
    ActiveX meinen Code setzen muss, um den Fokus abzufangen.

    In deinem Blog beschreibst du das für ein Webbrowser Control und
    OnDocumentComplete. Hast du für den Adobe Reader auch eine Idee,
    wie und wo man es handhaben kann?


Anmelden zum Antworten