![]() |
bestimmte Tasten Sperren.
HY community.
Ich habe ein Problem. Wir sollen in der Schule ein Programm schreiben, in welchem man nur den Ziffernblock benutzen kann. (Tasten 0-9) Nun ist meine frage, wie geht das? Ich dachte da an Invalidkey, aber da müsste ich ja jeden einzeln sperren. Gibt es da eine andere Möglichkeit,wie das mann alles außer ein paar bestimme sperrt? Wenn nicht, wie müsste das mit dem invalidkey aussehen? habe leider kein Plan davon, und die HIlfe hat mich auch nicht weitergebracht. Mfg Noobinator |
Re: bestimmte Tasten Sperren.
Beispiel mit KeyPress:
Delphi-Quellcode:
procedure TFormHaupt.EditVKKeyPress(Sender: TObject; var Key: Char);
begin if Key = #13 then Key := #0; if not (Key in ['0'..'9', #8, #13]) then Key := #0; end; |
Re: bestimmte Tasten Sperren.
Zitat:
steige da nicht dahinter <---- NOOB |
Re: bestimmte Tasten Sperren.
naja du lässt nur den zifferblock zu.
das heißt das alle anderen zeichen "umgeschrieben" werden müssen von dir. in dem beispiel wir das z.b. so realisiert: if Key = #13 then Key := #0; // wenn eingabe = zeilenvorschub [enter-taste] -> dann soll 0 erscheinen |
Re: bestimmte Tasten Sperren.
Zitat:
mit
Delphi-Quellcode:
prüfst du, ob die gedrückte Taste eine der Ziffern, Backspace (#8) oder Return (#13) ist.
Key in ['0'..'9', #8, #13]
durch
Delphi-Quellcode:
setzt du dann Key bei druch einer anderen Taste auf #0, das ist der Wert, der dem TEdit (z.B.) sagt, dass nicht auf den Tastendruck reagiert werden soll.
if not (Key in ['0'..'9', #8, #13]) then Key := #0;
Die Zeile
Delphi-Quellcode:
kannst du stehen lassen, wenn die Return-Taste nicht auch nicht gedrückt werden darf (ansonsten löschen oder auskommentieren).
if Key = #13 then Key := #0;
Auf Backspace sollte in jedem Fall geprüft werden, da man sonst Falsch-Eingaben nur korrigieren kann, wenn man alles markiert und überschreibt |
Re: bestimmte Tasten Sperren.
Denk aber dran bei der Lösung KeyPreview von Mainform auf true zu setzen :)
|
Re: bestimmte Tasten Sperren.
Zitat:
|
Re: bestimmte Tasten Sperren.
Zitat:
/edit: Schon wieder. Wo ist dieser rote Kasten? |
Re: bestimmte Tasten Sperren.
also mein Programm sieht wie folgt aus:
Delphi-Quellcode:
aber es funzt nicht... ich möchte nur die Tasten Backspace und 0-9 zulassen.
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public procedure FormVKKeyPress(Sender: TObject; var Key: Char); end; var Form1: TForm1; implementation {$R *.DFM} ... procedure TForm1.FormCreate(Sender: TObject); begin form1.onkeypress := FormVKKeyPress; ..... end; procedure TForm1.FormVKKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then Key := #0; if not (Key in ['0'..'9', #8]) then Key := #0; end; end. was ist falsch? |
Re: bestimmte Tasten Sperren.
Zitat:
Wo liegt genau der Fehler? (Compilermeldung oder Beschreibung was du machst, was es machen sollte und was dennoch passiert) Flare |
Re: bestimmte Tasten Sperren.
"Es funzt nicht" ist nicht besonders genau. Was passiert denn? Geht es kompilieren? Kommt eine AV? Werden die falschen Tasten angenommen?
Hast du auch bei Form1 KEYPREVIEW auf true gestellt? Ansonsten wird die Form beim Tasten annehmen einfach "übergangen" und es wird gar nicht deine Proc aufgerufen die die Eingaben löscht. Außerdem: Die Zeile mit dem #13 brauchst du eh nicht, da KEY ja eh auf 0 gesetzt wird, wenn es keine Zahl/Backspace ist. |
Re: bestimmte Tasten Sperren.
OK jetzt geht es soweit, das die "normalen" tasten nicht reagieren, aber wie kann man das mit den Sondertasten realisieren?
es würde schon reichen ALT zu deaktivieren, da man damit ja alle tastenkombinationen ausführt. (auch ein Kriterium des Programmes) |
Re: bestimmte Tasten Sperren.
Die Sondertasten können doch das Geschehen in deinem Programm nicht beeinflussen?
In irgendeiner onkeydown oder so gibt es einen Parameter der die gedrückten Sondertasten enthält. Wenn welche gedrückt sind, kannst du einfach auch den key auf #0 stellen. |
Re: bestimmte Tasten Sperren.
Übrigens sollte nicht nur Backspace sondern auch ENTF erlaubt sein ;)
|
Re: bestimmte Tasten Sperren.
Hast du den ASCII-Code von ENTF gerade mal zur Hand?
|
Re: bestimmte Tasten Sperren.
entf hat keinen ascii-code. das drücken dieser taste kannste nur in
onkeydown/onkeyup (der die virtual-keycodes übergeben werden) feststellen. |
Re: bestimmte Tasten Sperren.
ok es geht fast alles, nur noch die frage: wie könnte man die Taskleiste ausblenden whärend das Programm läuft? und wie kann man die Tastenkombi STRG + ESC verhindern, ohne am Treiber rumzufuschen, oder einen hook einzubauen?
Ich habe keinerlei Möglichkeit irgendwelche hooks einzubinden, oder die Treiber zu ändern. Habe schon die Sufu strapaziert, aber da finde ich nichts, und mit dem virtual keycodes geht es auchnicht, da die STRG taste windowsimplementiert ist, und nicht auf die Form zugreift. kann man das irgendwie lösen? es ist wichtig, es geht um meine Infonote. |
Re: bestimmte Tasten Sperren.
kann mir den keiner helfen?
wer kennt sich mit invaligkey aus? es ist wichtig. Tastenkombis die ich sperren müsste wären ALT+TAB, STRG+ESC. könnte mir jemand eine procedure schreiben? habe schon google und die Sufu strpaziert, aber ich finde nichts, das mir helfen könnte. |
Re: bestimmte Tasten Sperren.
Ich glaube um das zu deaktivieren, bleibt dir wohl nichts anderes
übrig als dich mit der Treiberprogramierung zu beschäftigen. Wegen der Taskleiste: Wenn du da bei Goolgle nichts findest, dann suchst du falsch. Viel Glück! Mfg Valle |
Re: bestimmte Tasten Sperren.
also wegen den kombis müsste es laut hilfe gehen:
Zitat:
|
Re: bestimmte Tasten Sperren.
warum willst du keinen hook verwenden?
über n system-hook müsste das doch möglich sein. |
Re: bestimmte Tasten Sperren.
Das programm soll ich auf unseren Schulrechner zum laufen bringen,und da kann ich nicht an den Treibern rumspielen.
und wegen den hooks weiss ich nicht, kann man die einfach so einbinden? (habe davon 0 ahnung) weiterhin hat mein Lehrer gesagt, das geht über eine Procedure, ohne etwas einzubinden und verwies mich auf invalidkey. ach und wegen der taskleiste: wie kann ich diese Procedure:
Delphi-Quellcode:
ins Formcreate einbinden?
procedure SetStartBtnEnabled(const AEnabled: Boolean);
begin EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd',nil), 0, 'Button', nil), AEnabled); end; sorry für die vielen fragen aber ich bin noch ein Noob^^ |
Re: bestimmte Tasten Sperren.
^^indem du einfach das hier ins Form-Create schreibst:
Delphi-Quellcode:
EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'Button',nil),true);
//bzw. das letzte true eben durch false ersetzen. |
Re: bestimmte Tasten Sperren.
thx4help. jetzt fehlt nur noch die ALT taste :wink:
|
Re: bestimmte Tasten Sperren.
also strg+esc kannste mit diesem keyboard hook sperren.
Delphi-Quellcode:
library KeyboardHook;
uses Windows, SysUtils, Classes; {$R *.res} type TKeybDLLHookStruct = packed record vkCode: integer; scanCode: integer; flags: integer; time: integer; dwExtraInfo: integer; end; PKeybDLLHookStruct = ^TKeybDLLHookStruct; const WH_KEYBOARD_LL = 13; var hKeyHook: THandle; function KeyboardProc_LowLevel(code: integer; wParam, lParam: Integer): integer; stdcall; var P: PKeybDLLHookStruct; KeyDown: Boolean; begin if Code < 0 then result := CallNextHookEx(hKeyHook, Code, wParam, lParam) else begin P := Pointer(lParam); KeyDown := P^.flags = 0; if KeyDown and (P^.vkCode = VK_ESCAPE) and Bool($8000 and GetAsyncKeyState(VK_CONTROL)) then result := HC_SKIP else result := CallNextHookEx(hKeyHook, Code, wParam, lParam); end; end; procedure StartHook; begin hKeyHook := SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc_LowLevel, HInstance, 0); end; procedure StopHook; begin UnhookWindowsHookEx(hKeyHook); end; exports StartHook, StopHook; begin end. bindeste so in dein prog ein:
Delphi-Quellcode:
rufst dann einfach beim OnCreate von deinem form
interface
... const HookDLL = 'KeyboardHook.dll'; procedure StartHook; external HookDLL; procedure StopHook; external HookDLL;
Delphi-Quellcode:
und beim OnDestroy
StartHook;
Delphi-Quellcode:
auf
StopHook;
|
Re: bestimmte Tasten Sperren.
FRAGE: was ist ein hook, und wo muss ich das hinschreiben? einfach eine neue unit einbinden und das reinschreiben oder wie? ich habe davon keine Ahnung. :roll:
|
Re: bestimmte Tasten Sperren.
Datei->Neu->Weitere->DLL-Experte (so is es zumindest bei mir mit d7).
und oben haste den kompletten quellcode für die dll. einma übersetzen und du hast ne dll die 2 funktionen exportiert: StartHook und StopHook. wie du die beiden funktionen dann in dein prog importierst und verwendest habe ich ja oben schon geschrieben. was ein hook is und wozu man ihn noch so verwenden kann guckste am besten ma unter ![]() |
Re: bestimmte Tasten Sperren.
wenn ich das jetzt speichern will, speichert der das als *.dpr usw...
wie kann ich das als DLL speichern? |
Re: bestimmte Tasten Sperren.
diese frage hätte sicher auch mit der sufu beantwortet werden können, aber nun gut...
natürlich speicherst du das als projekt-datei. dein projekt von deinem prog speicherst du ja auch nich als exe, oder? erst nach dem kompilieren is ne exe vorhanden. genauso bei der dll. einma kompilieren und eine dll-datei liegt parat. |
Re: bestimmte Tasten Sperren.
thx du hast mir sehr gehofen.
Wenn noch was ist, melde ich mich. EDIT: könntest du mir vllt noch einen Hook für ALT+TAB und STRG+ALT+ENTF schreiben? oder am besten alles in einem. habe versucht deinen abzuändern, aber bekomme das irgendwie nicht hin :roll: |
Re: bestimmte Tasten Sperren.
könntest du mir vllt noch einen Hook für ALT+TAB und STRG+ALT+ENTF schreiben?
oder am besten alles in einem. habe versucht deinen abzuändern, aber bekomme das irgendwie nicht hin :roll: |
Re: bestimmte Tasten Sperren.
Hi,
Ich glaube, dass sich zumindest Strg+Alt+Entf von Windows her nicht hooken lässt. mfG mirage228 |
Re: bestimmte Tasten Sperren.
Der Affengriff scheint zu gehen.
Jedenfalls habe ich irgendwo einen Code dafür gesehen. Da ich den Link dazu aber zu Hause habe, kann ich ihn frühestens heute Abend posten. |
Re: bestimmte Tasten Sperren.
Zitat:
Danke schonmal für die Hilfe |
Re: bestimmte Tasten Sperren.
ich glaube strg+alt+entf (und auch alt+tab) kann man nicht so einfach sperren.
vll hilft es dir aber ja, wenn du dein programm aus der liste im taskmanager entfernst. mit folgendem code kannste das bewerkstelligen (habe ich nicht selber geschrieben, sondern ma irgendwo gefunden - funzt aber). is wieder ne dll.
Delphi-Quellcode:
library HideProcessNT;
uses Windows,tlhelp32,ImageHlp,SysUtils; var hmap: THandle; hFirstMapHandle:THandle; type SYSTEM_INFORMATION_CLASS = (SystemBasicInformation, SystemProcessorInformation, SystemPerformanceInformation, SystemTimeOfDayInformation, SystemNotImplemented1, SystemProcessesAndThreadsInformation, SystemCallCounts, SystemConfigurationInformation, SystemProcessorTimes, SystemGlobalFlag, SystemNotImplemented2, SystemModuleInformation, SystemLockInformation, SystemNotImplemented3, SystemNotImplemented4, SystemNotImplemented5, SystemHandleInformation, SystemObjectInformation, SystemPagefileInformation, SystemInstructionEmulationCounts, SystemInvalidInfoClass1, SystemCacheInformation, SystemPoolTagInformation, SystemProcessorStatistics, SystemDpcInformation, SystemNotImplemented6, SystemLoadImage, SystemUnloadImage, SystemTimeAdjustment, SystemNotImplemented7, SystemNotImplemented8, SystemNotImplemented9, SystemCrashDumpInformation, SystemExceptionInformation, SystemCrashDumpStateInformation, SystemKernelDebuggerInformation, SystemContextSwitchInformation, SystemRegistryQuotaInformation, SystemLoadAndCallImage, SystemPrioritySeparation, SystemNotImplemented10, SystemNotImplemented11, SystemInvalidInfoClass2, SystemInvalidInfoClass3, SystemTimeZoneInformation, SystemLookasideInformation, SystemSetTimeSlipEvent, SystemCreateSession, SystemDeleteSession, SystemInvalidInfoClass4, SystemRangeStartInformation, SystemVerifierInformation, SystemAddVerifier, SystemSessionProcessesInformation ); PFARPROC = ^FARPROC; _IMAGE_IMPORT_DESCRIPTOR = packed record case Integer of 0:(Characteristics: DWORD); 1:(OriginalFirstThunk: DWORD; TimeDateStamp: DWORD; ForwarderChain: DWORD; Name: DWORD; FirstThunk: DWORD); end; IMAGE_IMPORT_DESCRIPTOR = _IMAGE_IMPORT_DESCRIPTOR; PIMAGE_IMPORT_DESCRIPTOR = ^IMAGE_IMPORT_DESCRIPTOR; procedure RedirectIAT(pszCallerModName: Pchar; pfnCurrent: FarProc; pfnNew: FARPROC; hmodCaller: hModule); var ulSize: ULONG; pImportDesc: PIMAGE_IMPORT_DESCRIPTOR; pszModName: PChar; pThunk: PDWORD; ppfn:PFARPROC; ffound: LongBool; written: DWORD; begin pImportDesc:= ImageDirectoryEntryToData(Pointer(hmodCaller), TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, ulSize); if pImportDesc = nil then exit; while pImportDesc.Name<>0 do begin pszModName := PChar(hmodCaller + pImportDesc.Name); if (lstrcmpiA(pszModName, pszCallerModName) = 0) then break; Inc(pImportDesc); end; if (pImportDesc.Name = 0) then exit; pThunk := PDWORD(hmodCaller + pImportDesc.FirstThunk); while pThunk^<>0 do begin ppfn := PFARPROC(pThunk); fFound := (ppfn^ = pfnCurrent); if (fFound) then begin VirtualProtectEx(GetCurrentProcess,ppfn,4,PAGE_EXECUTE_READWRITE,written); WriteProcessMemory(GetCurrentProcess, ppfn, @pfnNew, sizeof(pfnNew), Written); exit; end; Inc(pThunk); end; end; var addr_NtQuerySystemInformation: Pointer; mypid: DWORD; fname: PCHAR; mapaddr: PDWORD; hideOnlyTaskMan: PBOOL; function myNtQuerySystemInfo(SystemInformationClass: SYSTEM_INFORMATION_CLASS; SystemInformation: Pointer; SystemInformationLength:ULONG; ReturnLength:PULONG):LongInt; stdcall; label lop, nextpid, exit, fillzero; asm push ReturnLength push SystemInformationLength push SystemInformation push dword ptr SystemInformationClass call dword ptr [addr_NtQuerySystemInformation] or eax,eax jl exit cmp SystemInformationClass, SystemProcessesAndThreadsInformation jne exit lop: mov esi, SystemInformation nextpid: mov ebx, esi cmp dword ptr [esi],0 je exit add esi, [esi] mov ecx, [esi+44h] cmp ecx, mypid jne nextpid mov edx, [esi] test edx, edx je fillzero add [ebx], edx jmp lop fillzero: and [ebx], edx jmp lop exit: mov Result, eax end; procedure FuncIncept; var hSnapShot: THandle; me32: MODULEENTRY32; begin addr_NtQuerySystemInformation := GetProcAddress(getModuleHandle('ntdll.dll'),'NtQuerySystemInformation'); hSnapShot := CreateToolHelp32SnapShot(TH32CS_SNAPMODULE,GetCurrentProcessId); if hSnapshot = INVALID_HANDLE_VALUE then exit; try ZeroMemory(@me32,sizeof(MODULEENTRY32)); me32.dwSize:=sizeof(MODULEENTRY32); Module32First(hSnapShot,me32); repeat RedirectIAT('ntdll.dll',addr_NtQuerySystemInformation,@MyNtQuerySystemInfo,me32.hModule); until not Module32Next(hSnapShot,me32); finally CloseHandle(hSnapShot); end; end; procedure FreeFunc; var hSnapShot: THandle; me32: MODULEENTRY32; begin addr_NtQuerySystemInformation:=GetProcAddress(getModuleHandle('ntdll.dll'),'NtQuerySystemInformation'); hSnapShot:=CreateToolHelp32SnapShot(TH32CS_SNAPMODULE,GetCurrentProcessId); if hSnapshot=INVALID_HANDLE_VALUE then exit; try ZeroMemory(@me32,sizeof(MODULEENTRY32)); me32.dwSize:=sizeof(MODULEENTRY32); Module32First(hSnapShot,me32); repeat RedirectIAT('ntdll.dll',@MyNtQuerySystemInfo,addr_NtQuerySystemInformation,me32.hModule); until not Module32Next(hSnapShot,me32); finally CloseHandle(hSnapShot); end; end; var HookHandle: THandle; function CbtProc(code: integer; wparam: integer; lparam: integer):Integer; stdcall; begin Result:=0; end; procedure AttachHook; stdcall; begin HookHandle := SetWindowsHookEx(WH_CBT, @CbtProc, HInstance, 0); end; procedure LibraryProc(Reason: Integer); begin if Reason = DLL_PROCESS_DETACH then if mypid > 0 then FreeFunc() else CloseHandle(hFirstMapHandle); end; function HideNtProcess(pid:DWORD):BOOL; stdcall; var addrMap: PDWORD; ptr2: PBOOL; OnlyBlindTaskmgr: BOOL; begin mypid:=0; result:=false; OnlyBlindTaskmgr:=False; hFirstMapHandle:=CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,8,'NtHideFileMapping'); if hFirstMapHandle=0 then exit; addrMap:=MapViewOfFile(hFirstMapHandle,FILE_MAP_WRITE,0,0,8); if addrMap=nil then begin CloseHandle(hFirstMapHandle); exit; end; addrMap^:=pid; ptr2:=PBOOL(DWORD(addrMap)+4); ptr2^:=OnlyBlindTaskmgr; UnmapViewOfFile(addrMap); AttachHook; result:=true; end; exports HideNtProcess; begin hmap:=OpenFileMapping(FILE_MAP_READ,false,'NtHideFileMapping'); if hmap=0 then exit; try mapaddr:=MapViewOfFile(hmap,FILE_MAP_READ,0,0,0); if mapaddr=nil then exit; mypid:=mapaddr^; hideOnlyTaskMan:=PBOOL(DWORD(mapaddr)+4); if hideOnlyTaskMan^ then begin fname:=allocMem(MAX_PATH+1); GetModuleFileName(GetModuleHandle(nil),fname,MAX_PATH+1); if not (ExtractFileName(fname)='taskmgr.exe') then exit; end; FuncIncept; finally UnmapViewOfFile(mapaddr); CloseHandle(Hmap); DLLProc:=@LibraryProc; end; end. so bindeste das ein
Delphi-Quellcode:
und aufrufen kannste das dann so
function HideNtProcess(pid:DWORD):BOOL; stdcall; external 'HideProcessNT.dll';
Delphi-Quellcode:
HideNtProcess(GetCurrentProcessId);
|
Re: bestimmte Tasten Sperren.
danke für die Arbeit, aber das nützt mir nichts.. ich will nur verhindern, das man das Programm beiseiteschiebt. Sobald ich dann allerdings STRG+AL+ENTF drücke, minimiert das Fenster ja schon automatisch, und man hat es umgangen.
@DevilsCamp schau mal bitte ob du deins wiederfindest. |
Re: bestimmte Tasten Sperren.
Dieser Code stammt von
![]() Bei den Tips unter System
Delphi-Quellcode:
var
Affengriff: Longbool; //Taskmanager Aufruf verbieten procedure TForm1.Button1Click(Sender: TObject); begin SystemParametersInfo(97,Word(True),@Affengriff,0); end; //Taskmanager wieder erlauben procedure TForm1.Button2Click(Sender: TObject); begin SystemParametersInfo(97,Word(False),@Affengriff,0); //entsperrt end; Ich habe es nicht getestet, also keine Garantie, dass es funktioniert. |
Re: bestimmte Tasten Sperren.
ich glaub der o.g. code is nur für win9x/me.
unter nt/2k/xp geht der nich. |
Re: bestimmte Tasten Sperren.
ok eine Frage noch.. den Rest habe ich einfach alles so gelöst:
Delphi-Quellcode:
damit schiebt sich das Programm vor alle anderen, und ALT+TAB ist nutzlos^^
form1.formstyle:=tstayontop
auch das Startmenu ist dann dank vollbild ganze einfach weg^^ einfach herrlich diese Eigenschafft :mrgreen: Danke für die Ganze geduld und hilfe |
Re: bestimmte Tasten Sperren.
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz