SetFocus-Events beim Dialogaufruf verhindern



  • Hallo zusammen
    schon wieder ich...

    In meiner Anwendung habe ich verschiedene Dialoge.
    Die sind alle von einer eigenen Basis-Klasse abgeleitet, in der der SetFocus-Event
    abgefangen wird, damit eine Bildschirm-Tastatur damit geöffnet werden kann (für Panels mit Touch Screen).

    Nun habe ich plötzlich einen Dialog, bei dem so ein SetFocus-Event schon beim Start des Dialogs aufgerufen wird.
    Das Resultat ist, dass die Bildschirm-Tastatur noch vor dem eigentlichen Dialog aufgeht.
    Es wird kein von mir rein geschriebenes SetFocus aufgerufen!

    Ich habe sogar schon alle Anweisungen aus der "OnInitDialog()" rausgenommen.
    Ebenso im Konstruktor.
    Trotzdem wirds ausgelöst.
    Die ungewollte Tastatur erscheint jedenfalls nachdem die "OnInitDialog()" ausgeführt wurde.

    Ich habe den Dialog auch schon mit anderen, funktionierenden vergleichen.
    Mir fällt kein Unterschied auf.


  • Mod

    Setz doch einen Breakpoint und schau in den Callstack, wer das macht.
    Evtl. hast Du Code der das schon nach dem Erzeugen macht.

    Grundsätzlich gibt es automatische Tastaturen von Windows für Panels und Touch Screens. Wieso machst Du hier selber was.

    Damit meine Anwendungen auf Touch arbeiten muss ich "eigentlich nichts" machen.



  • Hallo Martin,

    ich habe schon viele Breakpoints gesetzt.
    Leider führen alle tief ins System und nicht in meine Anwendung.
    Für dieses Thema hatte ich schon mal etliche Tage verbraten, auch ohne Erfolg.

    Grüsse
    Helmut


  • Mod

    Spielt doch keine Rolle. Schau doch den Callstack an, dann siehst Du doch wer Das aufruft. Spätestens irgendwo im Create Code des Dialoges...



  • Ich habe jetzt den Call Stack mal hier.
    Ganz unten steht das "DoModal(..)", das den gewünschten Dialog aufruft.
    Habe nachgesehen. Es ist wirklich die ID des gewünschten Dialogs.

    Diese Codezeilen mal zuerst.

    int CBaseDialog::DoModal()
    {	
        RECT	sRect; 
    	BOOL	bRet;
    	int		iRet;
    	MSG		msg;
    	SIZE	sSize;
    	CBrush	cBrush(RGB(128,128,128)); 
    	sSize.cx = 1;
    	sSize.cy = 1;
    
    	if(!Create(m_nIDTemplate,GetMainViewWnd()))
    		return 0;
                ...
    

    Nun der Call Stack bis dahin:

    Titan2.exe!CBaseTastatur::CBaseTastatur(CWnd * pParent=0x00000000)  Line 59	C++
     	Titan2.exe!CTastaturNumerisch::CTastaturNumerisch(CWnd * pParent=0x00000000)  Line 20 + 0x4a bytes	C++
     	Titan2.exe!CBaseDialog::OnCommand(unsigned int wParam=16778584, long lParam=2429892)  Line 591 + 0xd bytes	C++
     	mfc80ud.dll!CWnd::OnWndMsg(unsigned int message=273, unsigned int wParam=16778584, long lParam=2429892, long * pResult=0x0018e878)  Line 1755 + 0x1e bytes	C++
     	mfc80ud.dll!CWnd::WindowProc(unsigned int message=273, unsigned int wParam=16778584, long lParam=2429892)  Line 1741 + 0x20 bytes	C++
     	mfc80ud.dll!AfxCallWndProc(CWnd * pWnd=0x00f6e308, HWND__ * hWnd=0x00181438, unsigned int nMsg=273, unsigned int wParam=16778584, long lParam=2429892)  Line 240 + 0x1c bytes	C++
     	mfc80ud.dll!AfxWndProc(HWND__ * hWnd=0x00181438, unsigned int nMsg=273, unsigned int wParam=16778584, long lParam=2429892)  Line 389	C++
     	mfc80ud.dll!AfxWndProcBase(HWND__ * hWnd=0x00181438, unsigned int nMsg=273, unsigned int wParam=16778584, long lParam=2429892)  Line 411 + 0x15 bytes	C++
     	user32.dll!75ba62fa() 	
     	[Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]	
     	user32.dll!75ba6d3a() 	
     	user32.dll!75ba6ce9() 	
     	user32.dll!75ba965e() 	
     	user32.dll!75ba96c5() 	
     	comctl32.dll!6f366528() 	
     	comctl32.dll!6f36080d() 	
     	comctl32.dll!6f360742() 	
     	comctl32.dll!6f2d8a2e() 	
     	comctl32.dll!6f2d9ab6() 	
     	user32.dll!75ba62fa() 	
     	user32.dll!75ba6d3a() 	
     	user32.dll!75ba6ce9() 	
     	mfc80ud.dll!CThreadSlotData::GetThreadValue(int nSlot=16471100)  Line 265	C++
     	user32.dll!75bb0d3f() 	
     	user32.dll!75bb0d65() 	
     	mfc80ud.dll!CWnd::DefWindowProcW(unsigned int nMsg=7, unsigned int wParam=332848, long lParam=0)  Line 1029 + 0x20 bytes	C++
     	mfc80ud.dll!CWnd::Default()  Line 274	C++
     	mfc80ud.dll!CWnd::OnSetFocus(CWnd * __formal=0x03290b98)  Line 3056	C++
     	mfc80ud.dll!CWnd::OnWndMsg(unsigned int message=7, unsigned int wParam=332848, long lParam=0, long * pResult=0x0018ede8)  Line 2079	C++
     	mfc80ud.dll!CWnd::WindowProc(unsigned int message=7, unsigned int wParam=332848, long lParam=0)  Line 1741 + 0x20 bytes	C++
     	mfc80ud.dll!AfxCallWndProc(CWnd * pWnd=0x00f6e4ec, HWND__ * hWnd=0x002513c4, unsigned int nMsg=7, unsigned int wParam=332848, long lParam=0)  Line 240 + 0x1c bytes	C++
     	mfc80ud.dll!AfxWndProc(HWND__ * hWnd=0x002513c4, unsigned int nMsg=7, unsigned int wParam=332848, long lParam=0)  Line 389	C++
     	mfc80ud.dll!AfxWndProcBase(HWND__ * hWnd=0x002513c4, unsigned int nMsg=7, unsigned int wParam=332848, long lParam=0)  Line 411 + 0x15 bytes	C++
     	user32.dll!75ba62fa() 	
     	user32.dll!75ba6d3a() 	
     	user32.dll!75ba6ce9() 	
     	user32.dll!75ba6de8() 	
     	msctf.dll!76415087() 	
     	user32.dll!75ba6e44() 	
     	ntdll.dll!77a9013a() 	
     	user32.dll!75bb1fb2() 	
     	user32.dll!75bd20b0() 	
     	mfc80ud.dll!wmemcpy_s(wchar_t * _S1=0x00400000, unsigned int _N1=8, const wchar_t * _S2=0x00000268, unsigned int _N=1578040)  Line 1233 + 0x1a bytes	C++
     	user32.dll!75bd10b3() 	
     	user32.dll!75bbcdc1() 	
     	mfc80ud.dll!CWnd::CreateDlgIndirect(const DLGTEMPLATE * lpDialogTemplate=0x00d78c60, CWnd * pParentWnd=0x03290b98, HINSTANCE__ * hInst=0x00400000)  Line 315 + 0x2a bytes	C++
     	mfc80ud.dll!CDialog::CreateIndirect(const DLGTEMPLATE * lpDialogTemplate=0x00d78c60, CWnd * pParentWnd=0x03290b98, void * lpDialogInit=0x00000000, HINSTANCE__ * hInst=0x00400000)  Line 211	C++
     	mfc80ud.dll!CDialog::CreateIndirect(void * hDialogTemplate=0x00d78c60, CWnd * pParentWnd=0x03290b98, HINSTANCE__ * hInst=0x00400000)  Line 188 + 0x16 bytes	C++
     	mfc80ud.dll!CDialog::Create(const wchar_t * lpszTemplateName=0x00000247, CWnd * pParentWnd=0x03290b98)  Line 170 + 0x14 bytes	C++
     	mfc80ud.dll!CDialog::Create(unsigned int nIDTemplate=583, CWnd * pParentWnd=0x03290b98)  Line 601 + 0x18 bytes	C++
    >	Titan2.exe!CBaseDialog::DoModal()  Line 388 + 0x22 bytes	C++
    >	Titan2.exe!CTitanCeApp::ProduktNeu()  Line 304 + 0x12 bytes	C++
    

    Dann vervollständige ich die Codezeile oben, mit dem "if(!Create(..) ..".
    Also die Ausführung war schon mittendrin, da ich den Breakpoint in den Konstruktor der zu diesem Zeitpunkt
    unerwünschten BIldschirm-Tastatur gelegt habe.

    Und, wie schon gesagt, ist da meine ID des Dialogs, 583, noch korrekt. (Also im obigen Code des "Create"-Aufrufs)

    Und ein Schritt nach diesem "Create(..", steht folgendes im Callstack.
    Aber die ID hat sich geändert, auf die hier unerwünschte Bildschirm-Tastatur, 256.

    >	Titan2.exe!CBaseDialog::DoModal()  Line 391	C++
     	Titan2.exe!CBaseDialog::OnCommand(unsigned int wParam=16778584, long lParam=2429892)  Line 594 + 0xb bytes	C++
     	mfc80ud.dll!CWnd::OnWndMsg(unsigned int message=273, unsigned int wParam=16778584, long lParam=2429892, long * pResult=0x0018e878)  Line 1755 + 0x1e bytes	C++
     	mfc80ud.dll!CWnd::WindowProc(unsigned int message=273, unsigned int wParam=16778584, long lParam=2429892)  Line 1741 + 0x20 bytes	C++
     	mfc80ud.dll!AfxCallWndProc(CWnd * pWnd=0x00f6e308, HWND__ * hWnd=0x00181438, unsigned int nMsg=273, unsigned int wParam=16778584, long lParam=2429892)  Line 240 + 0x1c bytes	C++
     	mfc80ud.dll!AfxWndProc(HWND__ * hWnd=0x00181438, unsigned int nMsg=273, unsigned int wParam=16778584, long lParam=2429892)  Line 389	C++
     	mfc80ud.dll!AfxWndProcBase(HWND__ * hWnd=0x00181438, unsigned int nMsg=273, unsigned int wParam=16778584, long lParam=2429892)  Line 411 + 0x15 bytes	C++
     	user32.dll!75ba62fa() 	
     	[Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]	
     	user32.dll!75ba6d3a() 	
     	user32.dll!75ba6ce9() 	
     	user32.dll!75ba965e() 	
     	user32.dll!75ba96c5() 	
     	comctl32.dll!6f366528() 	
     	comctl32.dll!6f36080d() 	
     	comctl32.dll!6f360742() 	
     	comctl32.dll!6f2d8a2e() 	
     	comctl32.dll!6f2d9ab6() 	
     	user32.dll!75ba62fa() 	
     	user32.dll!75ba6d3a() 	
     	user32.dll!75ba6ce9() 	
     	mfc80ud.dll!CThreadSlotData::GetThreadValue(int nSlot=16471100)  Line 265	C++
     	user32.dll!75bb0d3f() 	
     	user32.dll!75bb0d65() 	
     	mfc80ud.dll!CWnd::DefWindowProcW(unsigned int nMsg=7, unsigned int wParam=332848, long lParam=0)  Line 1029 + 0x20 bytes	C++
     	mfc80ud.dll!CWnd::Default()  Line 274	C++
     	mfc80ud.dll!CWnd::OnSetFocus(CWnd * __formal=0x03290b98)  Line 3056	C++
     	mfc80ud.dll!CWnd::OnWndMsg(unsigned int message=7, unsigned int wParam=332848, long lParam=0, long * pResult=0x0018ede8)  Line 2079	C++
     	mfc80ud.dll!CWnd::WindowProc(unsigned int message=7, unsigned int wParam=332848, long lParam=0)  Line 1741 + 0x20 bytes	C++
     	mfc80ud.dll!AfxCallWndProc(CWnd * pWnd=0x00f6e4ec, HWND__ * hWnd=0x002513c4, unsigned int nMsg=7, unsigned int wParam=332848, long lParam=0)  Line 240 + 0x1c bytes	C++
     	mfc80ud.dll!AfxWndProc(HWND__ * hWnd=0x002513c4, unsigned int nMsg=7, unsigned int wParam=332848, long lParam=0)  Line 389	C++
     	mfc80ud.dll!AfxWndProcBase(HWND__ * hWnd=0x002513c4, unsigned int nMsg=7, unsigned int wParam=332848, long lParam=0)  Line 411 + 0x15 bytes	C++
     	user32.dll!75ba62fa() 	
     	user32.dll!75ba6d3a() 	
     	user32.dll!75ba6ce9() 	
     	user32.dll!75ba6de8() 	
     	msctf.dll!76415087() 	
     	user32.dll!75ba6e44() 	
     	ntdll.dll!77a9013a() 	
     	user32.dll!75bb1fb2() 	
     	user32.dll!75bd20b0() 	
     	mfc80ud.dll!wmemcpy_s(wchar_t * _S1=0x00400000, unsigned int _N1=8, const wchar_t * _S2=0x00000268, unsigned int _N=1578040)  Line 1233 + 0x1a bytes	C++
     	user32.dll!75bd10b3() 	
     	user32.dll!75bbcdc1() 	
     	mfc80ud.dll!CWnd::CreateDlgIndirect(const DLGTEMPLATE * lpDialogTemplate=0x00d78c60, CWnd * pParentWnd=0x03290b98, HINSTANCE__ * hInst=0x00400000)  Line 315 + 0x2a bytes	C++
     	mfc80ud.dll!CDialog::CreateIndirect(const DLGTEMPLATE * lpDialogTemplate=0x00d78c60, CWnd * pParentWnd=0x03290b98, void * lpDialogInit=0x00000000, HINSTANCE__ * hInst=0x00400000)  Line 211	C++
     	mfc80ud.dll!CDialog::CreateIndirect(void * hDialogTemplate=0x00d78c60, CWnd * pParentWnd=0x03290b98, HINSTANCE__ * hInst=0x00400000)  Line 188 + 0x16 bytes	C++
     	mfc80ud.dll!CDialog::Create(const wchar_t * lpszTemplateName=0x00000247, CWnd * pParentWnd=0x03290b98)  Line 170 + 0x14 bytes	C++
     	mfc80ud.dll!CDialog::Create(unsigned int nIDTemplate=583, CWnd * pParentWnd=0x03290b98)  Line 601 + 0x18 bytes	C++
     	Titan2.exe!CBaseDialog::DoModal()  Line 388 + 0x22 bytes	C++
     	Titan2.exe!CTitanCeApp::ProduktNeu()  Line 304 + 0x12 bytes	C++
    

    Wenn diesen Dialog abbreche, gehts nochmals in obigen Code-Ausschnitt rein.
    Diesmal wieder mit der richtigen ID, die dann auch aufgerufen wird.

    Also irgendwo muss da was reinspucken?

    Grüsse
    Helmut


  • Mod

    Also OnInitDialog setzt auch grundsätzlich den Fokus auf das erste Control in dem Dialog, der ein WS_TABSTOP flag hat.

    Was erwartest Du also? Das war ja auch schon immer so!



  • Ich habe Dialoge, bei denen das nicht so ist.
    Und ich finde keinen Unterschied. Alle haben Tabstopps eingeschaltet.

    Ich werde noch weiter suchen ...


  • Mod

    Was ist das erste Control, das ein WS_TABSTOP hat.
    Also was steht oben in der Z-Order.

    Wie verlässt Du OnInitDialog. Mit False oder mit True?



  • Ich schliesse alle Dialoge mit "UpdateData(FALSE)" und "returnTRUE" ab.
    Zumindest trifft das auf die zwei Beispiele zu, die ich versuche, miteinander zu vergleichen.

    Die Z-Order geht von oben nach unten.
    Zuerst kommt ein "static" Text Control, dann ein "CEdit" Control, usw.
    Für alle editierbaren Controls sind die Tabstops auch auf TRUE gesetzt.

    Und alles in meinen beiden Dialogen gleich, bei dem, der funktioniert und dem anderen eben auch.

    Diese Anwendung besitzt viele Dialoge.
    Als Standard wird für die Eingabe in die Controls mit einer Bildschirm-Tastatur gearbeitet.
    Die Art dieser Tastatur ist von der Verwendung des Controls abhängig.
    Also hat das immer schon funktioniert! nur bei dem Einen eben nicht.

    Vor einiger Zeit musste ich ein paar Controls in TabCtrls integrieren.
    Da hatte ich auch dieses Problem.
    Das konnte ich damit lösen, dass ich im Haupt-Dialog de Event abgefangen hatte.
    Der Rest ging dann. Hatte mich aber auch viel Zeit gekostet.
    Aber hier brauche ich den "OnFocus"-Event ja, aber später.

    Ich habs auch ausprobiert.
    Es ist egal, ob ich den "OnInitDialog" mit TRUE oder FALSE abschliesse.
    Zumindes ist das Resultat dasselbe.


  • Mod

    Aber das erste Edit Control mit WS_TABSTOP bekommt immer den Fokus, wenn Du TRUE zurückgibst.
    Also muss auch immer Deine Windows Tastatur erscheinen...

    Es gibt da kein unterschiedliches Verhalten. Außer Du prüfst noch mehr.
    Ist der Dialog zum Beispiel sofort visible oder erst später. Vielleicht sind das ja solche Effekte, die das beeinflussen.



  • Ein weiterer Effekt ist ob der Dialog modal oder nicht modal geöffnet wird.
    AFAIK bekommen modale dialoge immer den Focus



  • Meine Dialoge sind alle modal.
    Und diese Bildschirm-Tastatur erscheint vor dem eigentlichen Dialog!



  • Also, ich gehe davon aus, dass es keine Möglichkeit gibt, diese Dreckeffekte, die ich mir irgendwie eingehandelt habe , per Fernanalyse zu lösen.

    Aber trotzdem vielen Dank für Eure Versuche.
    Grüsse
    Helmut


  • Mod

    Grundsätzlich würde ich sowas auch nur Remote Debuggen!


Anmelden zum Antworten