Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Tasten sperren in C++ Builder 6

Empfohlene Antworten

Veröffentlicht

Hallo,

ich bin ziemlich neu auf dem Gebiet des Builders, allerdings schon weit gekommen mit meinem Programm:

Und zwar hab ich eine Passwortabfrage erstellt, der Gedanke dahinter ist, dass ich das Programm (wenn es fertig ist) öffnen will, und der PC dadurch gesperrt ist.

Das Programm funktioniert soweit auch schon, nur kann man es deaktivieren, sprich, am Desktop weiter klicken.

Mein Prob ist nun also, wie bekomme ich das Programm immer im Vordergrund gehalten und wie kann ich die Tasten ESC, Strg, ALT, Entf sperren?

Wäre für Codes SEHR dankbar.

Ich weiss das die nötigen Befehle OnKeyDown, OnKeyUp, OnKeyPress sind, soweit hab ich die Hilfe von Borland verstanden, mehr aber auch nicht wirklich.

In C++ bin ich, was die "Basics" angeht, soweit fit (Funktionen, Klassen,...)

Danke schonmal :)

Hi Bukker,

also das mit dem Programm immer im Vordergrund halten ist kein Problem.

dazu gibts die Eigenschaft:

MainForm->FormStyle = fsStayOnTop;

Allerdings wirst du mit deinem Programm nicht die Kontrolle über das Betriebsystem übernehmen können!

Wenn du also den Computer sperren willst, schreib doch einen Bildschirmschoner. Bei dem kann dann die Passwortsperre aktiviert werden :D

Hallo,

Füge Deinem Dialog einfach PreTranslateMessage() hinzu.

Darin kannst Du dann praktisch alle Fenstermeldungen abfangen und bearbeiten. Auch Mauseingaben oder was auch immer.

Weiter unten werden dann noch bestimmte Fenstermeldungen rausgefiltert.

Ich fange hier mal die Tasteneingaben ab und gebe sie im TRACE-Fenster vom Studio aus (so kannst Du spezielle Tasten rausfiltern)

Man kann so ähnlich natürlich auch die Nachrichten praktisch ALLER Fenster vom Betriebssystem ausfiltern und bearbeiten... aber sowas muß man ja nicht gleich ins Forum schreiben (find ich). Es reicht doch völlig aus, wenn Du den Dialog Systemmodal machst (ist eine ganz normale Dialogeigenschaft - kannst ja im Forum danach suchen).


MyDlg::PreTranslateMessage(MSG*pMsg)
{
bool returnvalue = false;
if (pMsg->message == WM_KEYDOWN || pMsg->message == WM_KEYUP )
{
// wParam = virtual Keycode, lParam = Key data
TRACE("%x %x\n",pMsg->lParam, pMsg->wParam);
returnvalue = true;
}

// SendMessage(WM_SYSCOMMAND,SC_MINIMIZE);
// TRACE("%i\n",pMsg->message);
if ((pMsg->message == WM_SYSCOMMAND && pMsg->wParam==SC_CLOSE) || (pMsg->message == WM_QUIT || pMsg->message == WM_CLOSE && pMsg->hwnd==m_hWnd))
returnvalue = true;

return returnvalue;
}
[/PHP]

PreTranslateMessage kann ich mir nicht vorstellen dass das geht,

glaube da kannst du nur Messages des eigenen Prozesses und nicht

Systemweit abfangen...

Wenn du Systemweit alle Nachrchten abfangen willst brauchst IMO

einen systemweiten Hook. Hierzu kannst du dir mal die Funktionen

SetWindowsHookEx und die Callback LowLevelKeyboardProc

anschauen, damit müsste es dir möglich sein alle Keyboardevents

des Systems abzufangen, außer natürlich wenn noch ein Prozess einen

Hook installiert hat.

Um das Sperren des gesamten Systems zu realisieren wäre es evtl.

eine Alternative dein Programm anstatt der normalen Windowsshell

zu starten und nur bei korrekter Eingabe des Passwortes die Shell

nachzustarten :-)

Gruß

Diablo999

Hmm,...

Also verstehen tu ich das nicht grad alles, aber ich versuche mal was damit anzufangen. Ich melde mich wieder, danke schonmal :)

Hi, da bin ich wieder.

@ Manfred.Becker: Das hat nicht funktioniert, das Fenster auf diese Weise im Vordergrund zu halten.

Realisiert hab ich es nun so:

SetWindowPos(

Handle,

HWND_TOPMOST,

0,

0,

0,

0,

SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);

@ Crush: Die Funktion PreTranslateMessage war dem Builder irgendwie nicht gekannt, hab mir da noch paar Infos von der MSDN Page geholt, aber des wollt ned so recht.

@Diablo: Und das mit den Hooks, ist glaube schon ne Feine Sache, nur, des wollt auch ned so, habs ned hinbekommen.

Anscheinend hab ich mich an etwas rangewagt, dass zu viel für mich ist !? Ich weiss es nicht.

Du könntest den Befehl LockWorkStation() verwenden, dass sollte das Gleiche sein (ungetestet), als ob Du Windows+L auf der Tastatur drückst.

Zum selbst probieren und für ein paar Hintergrundinfos kannst Du Dir folgenden Artikel anschauen:

http://www.codeproject.com/win32/AntonioWinLock.asp

Nachdem ich den Artiel überflogen habe würde ich jedoch sagen: lass es sein ;)

Also das WinLock sieht echt gut aus, hab noch ned ausprobiert, werde auch die nächsten paar Tage wenig Zeit finden, aber ich melde mich wieder, ganz bestimmt.

Danke für den Link :)

Da bin ich wieder...

Also der Link war in Ordnung, hat mich auf paar Ideen gebracht, meine verschwundene Taskleiste ist der Beweis :D

Muss euch aber mal fragen wo der Fehler in meinem Prog ist, habe Probleme mit der SetWindowsHookEx Funktion:

Eingebunden habe ich die...


#include <vcl.h>

#include <windows.h>

#include <Lmcons.h>

#include <Winuser.h>

#pragma hdrstop

#include "Passwort_unit.h"

#include "Passweingabe.h"


//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

Meine Funktion sieht wie folgt aus - schreibe dahinter die Fehlermeldung als Kommentar !

HHOOK SetWindowsHookEx (

 WH_KEYBOARD,    [b]//Konvertierung von INT nach VOID* nicht möglich

                          // ) erwartet[/b]

 handle,

 User32.lib | user32.dll,

 0

);




LRESULT KeyboardProc(...)[b]//Ungültige Verwendung von typedef 'LRESULT'

                    //Auch in der 1. Zeile -> // In Anweisung fehlt ;[/b]

  {

     if (Key == VK_SOMEKEY)

    return 1;             // Trap key


    //return CallNextHookEx(...); // Let the OS handle it

  };



} //ENDE TFORM1 !!! [b]//W8004 SetWindowsHookEx wurde ein Wert zugewiesen der nie verwendet wird[/b]




[b]void __fastcall TForm1::bbCancelClick(TObject *Sender)[/b]

{

Application -> MessageBox ( "Die Aktion wurde durch den Benutzer abgebrochen.",

"Passwortabfrage", MB_ICONSTOP);


UnhookWindowsHookEx();  [b]//Zu wenige Parameter im Aufruf von....

Close();

}[/b]

Könnt ihr mir da helfen ?

Sorry wenn ich so oft poste, aber ich das Prob jetzt bis auf 2 Sachen hinbekommen:


LRESULT CALLBACK HookProc(...)[b]   //Ungültige Verwendung von typedef 'LRESULT'

                    //Auch in der 1. Zeile -> // In Anweisung fehlt ;[/b]

  {

     if (Key == VK_SOMEKEY)

    return 1;             // Trap key


    //return CallNextHookEx(...); // Let the OS handle it

  };


Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.