[eVC++] Programm schliessen kann nicht verhindert werden



  • Guten Tag,
    ich versuche gerade meine Applikation etwas geschlossener zu machen, dass nich an dem mobilen Gerät rumgefummelt wird. Es läuft mit Windows CE 4.2.
    Nun zu meinem Problem: Aus dem Programm lässt sich mit zu vielen Möglichkeiten "entkommen".
    In der Applikation gibt es oben diese Systemleiste mit nem "Ok"-Button und einem "X"-Button. Wenn man auf diese Knöpfe drück kann ich das Schliessen durch übersteuern der OnOk() und OnClose() verhindern. Problem: Ich schalte die Systemleiste mittels

    ModifyStyle(WS_CAPTION|WS_SYSMENU,0);
    

    weg.
    Weitere TAsten auf dem Gerät sind Enter, Escape und die Windows-Taste, die das Start-Popup öffnet. Letzteres habe ich mittels Timer "gelöst", der den Dialog alle 100ms in den Vordergrund schickt.
    Allerdings habe ich KEINE Möglichkeit gefunden, Enter und Escape zu verhindern. Bei den beiden Tasten weis ich nicht genau was passiert, aber die OnDestroy-Methode des Dialogs wird aufgerufen. Leider kann ich es meiner Erkenntnis nach in dieser Methode nicht mehr verhindern, dass das Programm geschlossen wird.
    Ich habe mich auch mit Keyboard-Hooks befasst, doch musste erkennen, dass diese in WindowsCE nicht unterstützt werden.
    Hat jemand von euch noch eine konstruktive Idee, wie ich festlegen kann, dass durch die 2 Tasten mein Dialog nicht geschlossen wird?
    Liebe Grüße
    Basti
    P.S. Ich arbeite mit einem Datalogic Kyman .NET


  • Mod

    1. Windows Taste erzeugt ein WM_SYSCOMMAND!
    2. Escape und Return erzeugen OnOK, und OnCancel pr default.
    3. Grundsätzlich kannst Du das Schließen der Anwendung über WM_CLOSE verhinder (siehe MSDN).
    4. Warum verwendest Du diesen komischen Timer? Kennst Du WS_EX_TOPMOST?



  • zu 4.
    Das hier steht du SetWindowsPos() in der Hilfe:

    This function changes the size, position, and z-order of a child, pop-up, or top-level window. Child, pop-up, and top-level windows are ordered according to their appearance on the screen. The topmost window receives the highest rank and is the first window in the z-order.
    
    BOOL SetWindowPos( 
      HWND hWnd, 
      HWND hWndInsertAfter, 
      int X, 
      int Y, 
      int cx, 
      int cy, 
      UINT uFlags 
    ); 
    Parameters
    hWnd 
    [in] Handle to the window. 
    hWndInsertAfter 
    [in] Handle to the window to precede the positioned window in the z-order. This parameter must be a window handle or one of the following values. Value Description 
    HWND_BOTTOM Places the window at the bottom of the z-order. If the hWnd parameter identifies a topmost window, the window loses its topmost status and is placed at the bottom of all other windows. 
    HWND_NOTOPMOST Places the window above all non-topmost windows (that is, behind all topmost windows). This flag has no effect if the window is already a non-topmost window. This value is not supported in Windows CE versions 1.0 and 1.01.  
    HWND_TOP Places the window at the top of the z-order. 
    HWND_TOPMOST Places the window above all non-topmost windows. The window maintains its topmost position even when it is deactivated. This value is not supported in Windows CE versions 1.0 and 1.01. 
    
    For more information about how this parameter is used, see the Remarks section.
    

    aber wenn ich

    SetWindowPos(GetDesktopWindow(),HWND_TOPMOST,0,0,240,320,SWP_SHOWWINDOW);
    

    mache, sagt mir der compiler
    "'SetWindowPos' : function does not take 7 parameters".
    Es gibt noch ein CWindow::SetWindowPos und ein CWnd::SetWindowPos. Warum genau nimmt der Compiler jetzt nich die Funktion, von der ich die Hilfe hier mal hingeschrieben habe, die nun mMn 7 Parameter akzeptiert?
    Gruß
    Basti



  • *push* wegen edit



  • Hallo,

    Warum genau nimmt der Compiler jetzt nich die Funktion, von der ich die Hilfe hier mal hingeschrieben habe, die nun mMn 7 Parameter akzeptiert?

    Weil du dich in einer Klasse befindest, und dort wird mit diesem "einfachen" Aufruf die Klassen-Methode angesprochen. Um auf die "globale Ebene" zuzugreifen (aus dem Klassengültigkeitsraum "auszubrechen"), wird der Bereichsauflösungs-Operator (scope resolution operator) verwendet:

    ::SetWindowPos(GetDesktopWindow(),HWND_TOPMOST,0,0,240,320,SWP_SHOWWINDOW);
    

    MfG,

    Probe-Nutzer


Log in to reply