2016-04-17 7 views
0

Ich möchte die Funktionalität einer Anwendung von Drittanbietern erweitern, die Tastenkombinationen für die Verwendung auf einem Touchscreen-Monitor verwendet. Mein Plan, um dies zu erreichen, war, eine Bildschirmtastatur zu machen, um Tastenanschläge (virtuell) zur Anwendung zu führen und den Fensterstil zu ändern, um es in die Tastatur einzubetten.MFC C++ auf der Bildschirmtastatur als übergeordnetes Dialogfeld

Da die Applikation (Mach3) die Erweiterung der Funktionalität um Plugins unterstützt, wollte ich so mein Ziel erreichen.

Für die Einbettung habe ich den Code von here so geändert, dass beim Laden von mach3 der Anwendungsdialog sofort in meinen Dialog eingebettet wird.

Für die Tastaturfunktionalität habe ich Code von here verwendet, um dem Fenster den WS_EX_NOACTIVATE Stil und den Griff zu geben, der richtig verschoben wird.

Das Problem, das ich habe, ist, dass, wenn ich Fokus auf ein anderes Fenster (zum Beispiel Notepad) geben und eine Taste drücken, um einen Tastendruck zu erzeugen, der Tastendruck wird korrekt von der anderen Anwendung empfangen, aber wenn ich den Fokus auf die Eingebettetes Fenster und eine Taste drücken, der Fokus wird auf die Schaltfläche verschoben und kein Tastendruck wird vom untergeordneten Dialog empfangen.

Wie verhindere ich, dass der Fokus so geändert wird? Ist das eine einfache Sache, die ich vermisse oder muss ich meinen Ansatz drastisch ändern?

Ich würde etwas Code posten, aber es gibt ziemlich viel davon und ich bin nicht sicher, welche Bits das relevanteste sein würden, um dieses Problem zu lösen.

+0

http://stackoverflow.com/questions/1372202/let-my-mfc-dialog-receive-keystroke-events-before-its-controls-mfc-win32-equiva –

+0

das scheint anders zu sein, ich don ' Ich möchte, dass mein dialog den keypressed schluckt, ich möchte, dass sie an das applikationsfenster übergeben werden, und damit der fokus nicht geändert wird, denke ich, dass der fokus hier das große thema ist. –

+1

Ich denke Ihr Problem ist, dass, da die eingebettete Anwendung in Ihrem Dialog ist, der auch die virtuelle Tastatur enthält, der Code, der den Fokus zurück auf das vorherige Fenster überträgt (in OnMouseMove), wahrscheinlich nur den Fokus auf Ihren eigenen Dialog und auf die virtuelle Tastaturschaltfläche überträgt . Ich denke, dass dies einige Tests erfordert. Übrigens sehe ich im Kommentarbereich des MFC-Artikels, dass es eine Korrektur für das Projekt gibt, hast du es versucht? –

Antwort

1

Ich habe die Ursache meines Problems herausgefunden, das es mir jetzt ermöglicht, einen eingebetteten Dialog mit dem übergeordneten Dialog zu erstellen, der als eine Bildschirmtastatur fungiert.

zunächst als kommentierte oben Ich brauchte einige Änderungen an meiner Tastatur Code zu machen, speziell die überschrieben OnNcLButtonDown, die der Artikel sagt, sollte sein:

void COnScreenKeyboardDlg::OnNcLButtonDown(UINT nHitTest, CPoint point) 
{ 
if (!m_hForegroundWnd) 
{ 
    // store current foreground window 
    m_hForegroundWnd = ::GetForegroundWindow(); 
    // temporarily make this dialog an activatable window 
    ModifyStyleEx(WS_EX_NOACTIVATE,0); 
    // make this dialog foreground 
    SetForegroundWindow(); 
} 
CDialog::OnNcLButtonDown(nHitTest, point); 
} 

aber eigentlich sein sollte:

void CWrapperDialog::OnNcLButtonDown(UINT nHitTest, CPoint point) { 
    SetForegroundWindow(); 
    CDialog::OnNcLButtonDown(nHitTest, point); 
} 

zweitens der Artikel sagt, OnMouseMove zu überschreiben mit:

void COnScreenKeyboardDlg::OnMouseMove(UINT nFlags, CPoint point) 
{ 
if (m_hForegroundWnd) 
{ 
    // make the previous foreground window active 
    ::SetForegroundWindow(m_hForegroundWnd); 
    // make this dialog non-activating 
    ModifyStyleEx(0,WS_EX_NOACTIVATE); 
    // set it to NULL to mark that we do not need to do this again 
    m_hForegroundWnd = NULL; 
} 
CDialog::OnMouseMove(nFlags, point); 
} 

der Kommentar unten „korrigiert“, dies zu:

void CWrapperDialog::OnMouseMove(UINT nFlags, CPoint point) { 
    ::SetActiveWindow(0); 
    CDialog::OnMouseMove(nFlags, point); 
} 

jedoch fand ich mit diesem Code, dass ich aus dem Fokus erhalten blinken würde zu ändern, wenn ich die Maus bewegt, so dass ich es ganz weggelassen.

schließlich die Tastatur Beispiel verwendete DoModal den Dialog zu schaffen, während ich Create

ich eine Wrapper-Funktion erstellt wurde ich mit AfxBeginThread nennen könnte:

UINT CWrapperDialog::ThreadDoModal(LPVOID pParam){ 
    CWrapperDialog* dlg; 
    dlg = ((CWrapperDialog*)pParam); 
    dlg->DoModal(); 
    return 0; 
} 

und nannte es:

dlg = new CWrapperDialog; 
AfxBeginThread(dlg->ThreadDoModal, dlg); 

und jetzt werden die Nachrichten korrekt übergeben.

Dank o_weisman für den Tipp bezüglich der Änderungen am Beispiel, da dies einen großen Unterschied machte.