Zum Inhalt springen

Tasten sperren in C++ Builder 6


Bukker

Empfohlene Beiträge

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 :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

  };


Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...