AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Applikation IMMER im Vordergrund
Thema durchsuchen
Ansicht
Themen-Optionen

Applikation IMMER im Vordergrund

Ein Thema von sundance · begonnen am 8. Apr 2013 · letzter Beitrag vom 9. Apr 2013
Antwort Antwort
Benutzerbild von sundance
sundance

Registriert seit: 9. Mai 2006
98 Beiträge
 
Delphi 7 Professional
 
#1

Applikation IMMER im Vordergrund

  Alt 8. Apr 2013, 11:17
Hallo DelphiGemeinde,

ich habe folgende Herausforderung:
Eine Applikation soll ein Fenster anzeigen, welches in der Bildschirmmitte im Vordergrund aller Fenster angezeigt wird. Das habe ich mit fsStayOnTop und einer schwarzen, davorliegenden teiltransparenten Form (Größe = kompletter Bildschirm) gelöst (damit kann man die bereits vorhandenen Fenster nicht mehr per Mausklick aktivieren). Das Fenster soll den Benutzer dazu zwingen, eine Auswahl zu treffen und dann auf OK zu klicken.
Leider kann man aber per Taskmanager bzw. Taskwechsel auf eine offene Applikation umschalten und somit mein Programm "in den Hintergrund" verfrachten, ohne die notwendige Auswahl zu treffen.
Gibt es eine (einfache) Möglichkeit, das zu verhindern?

(edit: Programm soll unter XP laufen)

Geändert von sundance ( 8. Apr 2013 um 11:40 Uhr)
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
677 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Applikation IMMER im Vordergrund

  Alt 8. Apr 2013, 11:38
Welches Betriebssystem?

Ab Vista macht UAC vor, wie es gehen könnte (wobei die API-Funktionen seit Win2000 vorhanden sein sollten) - alternativen Desktop anlegen und bei Prozessstart vor UI-Initialisierung den UI-Thread dahin auswandern lassen.

UAC schaltet dazu consent.exe dazu und wertet wohl dessen Rückgabewert aus. Da afaik eine bereits angezeigte Anwendung nicht den Desktop wechseln kann, bräuchtest Du auch einen Helfer-Prozess dafür.

Stichworte: MSDN-Library durchsuchenCreateDesktop, MSDN-Library durchsuchenSetThreadDesktop, MSDN-Library durchsuchenSwitchDektop. Für's Debuggen sicherstellen, dass der Wechsel auf den Originaldesktop immer irgendwie noch erfolgen kann, sonst wird's ungemütlich
  Mit Zitat antworten Zitat
Benutzerbild von sundance
sundance

Registriert seit: 9. Mai 2006
98 Beiträge
 
Delphi 7 Professional
 
#3

AW: Applikation IMMER im Vordergrund

  Alt 8. Apr 2013, 11:44
@CCRDude,
ich fürchte, das übersteigt meine Programmierkenntnisse ein wenig...
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Applikation IMMER im Vordergrund

  Alt 8. Apr 2013, 11:46
Nicht wirklich einfach, denn danach geht es munter weiter. Wie stark willst du das System abschotten?
  • Systemtasten (ALT+TAB, Windows-Taste, STRG+ESC, ...)
  • Task-Manager
  • User-Logoff
  • Rechner herunterfahren
  • Popups, z.B. Autorun bei eingestecktem USB-Stick

Ich würde als erstes überlegen, ob es wirklich wert ist, die zusätzliche Zeit hier zu investieren, oder ob man hier nicht schon den Schlussstrich zieht.

Falls du dich für die erste Variante entscheidest (ich habe es getan ), hier in Kurzform:

Die Systemtasten musst du mit einem globalen Lowlevel-Keyboard-Hook abblocken. Hier im Forum findet man bestimmt was zu "Systemtasten deaktivieren" oder den Stichworten WH_KEYBOARD_LL und LowLevelKeyboardProc .

Selbst wenn die Tasten raus sind, gibt es noch eine Menge anderer Möglichkeiten, beispielsweise kann man immer noch mit rechts auf die Taskleiste klicken und von dort den Taskmamanger aufrufen. Um den Taskmanager (oder Abmelden des Benutzers) zu deaktivieren braucht dein Programm übrigens Adminrechte, geht aber insgesamt recht einfach mit einem Registry-Eintrag...


Einen komplett neuen Desktop zu erstellen wäre eine zweite Methode (die ich aus Interesse auch mal gefahren bin), macht meiner Meinung nach aber weder viel Sinn noch Spaß, es sei denn, man will Atomkraftwerke nach militärischen Standards absichern - Wenn ich nicht danebenliege, greift selbst ein auf Desktop 1 gestarteter Keylogger keine Passwörter ab, die auf Desktop 2 eingegeben werden. Nur wie gesagt - Wenn dein Programm nicht wieder korrekt zu Desktop 1 zurückwechselt - Dann bleibst du da
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
677 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Applikation IMMER im Vordergrund

  Alt 9. Apr 2013, 07:20
@Günther: die ersten drei Punkte davon erledigt der dritte Desktop ja schon.

Und das sind wirklich nur 3-4 API-Aufrufe, die natürlich richtig geplant sein müssen. Ich hab mir ne Unit ( < 400 Zeilen, schon inklusive Code, vom vorigen Desktop einen Screenshot zu erstellen und als neuen ausgegrauten Hintergrund zu verwenden) geschrieben, die im initialization auf einen anderen Desktop wechselt und im finalization zurück. Solange das verwendende Programm nicht in anderen Units im initialization-Teil bereits UI-relevante API-Aufrufe verwendet, füge ich diese nur dem uses-Part zu und fertig (hier meine Anwendung)

Ganz ehrlich - Keyboard-Hooks sind komplizierter

Ob es hier wirklich Sinn macht, kann ich natürlich nicht entscheiden, diese Technik ist ja schon ein sehr harter Eingriff in die Rechnernutzung und sollte wohl überlegt sein.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Applikation IMMER im Vordergrund

  Alt 9. Apr 2013, 07:51
Ja, das ist wirklich ein ziemlich deftiger Eingriff in den normalen Ablauf. Ich würde mir das auch drei mal überlegen ob man das wirklich braucht.

Als ich mich damit befasst hatte, kannte ich mich noch weniger mit Delphi aus und wusste nichts von einem initialization und finalization - Dementsprechend fummelig wurde es dann auch, da man einen Prozess nicht mehr von einem Desktop zum anderen schieben kann - Wurde er dort erstellt, bleibt er dort. Einzelne Threads schon, aber keine ganzen Prozesse (oder? )

Funktionierte STRG+ALT+ENTF nicht mehr auf dem zweiten Desktop? Ich dachte schon, könnte mich aber auch irren...


Trotzdem finde ich auch, der zweite Desktop bleibt die "noch sicherere" Alternative. Stellt sich nur die Frage, ob man das wirklich braucht...
  Mit Zitat antworten Zitat
Benutzerbild von sundance
sundance

Registriert seit: 9. Mai 2006
98 Beiträge
 
Delphi 7 Professional
 
#7

AW: Applikation IMMER im Vordergrund

  Alt 9. Apr 2013, 10:00
@CCRDude:
Zitat:
Ich hab mir ne Unit ( < 400 Zeilen, schon inklusive Code, vom vorigen Desktop einen Screenshot zu erstellen und als neuen ausgegrauten Hintergrund zu verwenden) geschrieben (...)
Vielleicht kannst du dich ja durchringen, uns diese Unit zur Verfügung zu stellen...

@Günther:
Deiner Anregung folgend habe ich jetzt folgendes eingebaut:
Code:
// --- Routinen zur Installation eines Keyboard-Hooks --------------------------

var
  HookHandle: Cardinal = 0;


function LowLevelKeyboardProc(nCode: Integer; wParam: wParam; lParam: lParam): LRESULT; stdcall;
begin
  if (nCode < 0) then
    Result := CallNextHookEx(HookHandle, nCode, wParam, lParam)
  else
    Result := 1;
end;


function InstallHook(Hwnd: Cardinal): Boolean; stdcall;
begin
  Result := False;
  if (HookHandle = 0) then begin
    HookHandle := SetWindowsHookEx(13, LowLevelKeyboardProc, 0, 0);
    Result := (HookHandle <> 0);
  end;
end;


function UninstallHook: Boolean; stdcall;
begin
  Result := UnhookWindowsHookEx(HookHandle);
  HookHandle := 0;
end;
wobei InstallHook im FormCreate und UninstallHook im FormDestroy Event ausgeführt wird.
Damit habe ich (fast) alles gesperrt, was mir wichtig war (Die Taskleiste kann der Anwender wegen der vollformatigen, schwarzen Form nicht erreichen).
Aber der gemeine Anwender ist meist sehr erfinderisch; mal sehen, was er sich jetzt einfallen läßt...
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Applikation IMMER im Vordergrund

  Alt 9. Apr 2013, 10:05
Aber der gemeine Anwender ist meist sehr erfinderisch; mal sehen, was er sich jetzt einfallen läßt...
Und wie. Deshalb würde ich mich auch nicht vertraglich auf irgendetwas festnageln lassen, dass irgendein Zugriff dadurch effektiv unterbunden wird. Denn STRG+ALT+ENTF hebelt man nicht einfach mit einem Keyboard-Hook aus, was ist, wenn die Stromzufuhr kurzzeitig unterbrochen wird, wandern Popups durch späteres Einstecken eines USB-Sticks wieder in den Hintergrund, was ist, wenn die Maussoftware bsp. ein Klicken des Mausrads auf ein Öffnen des Startmenüs mappt, ...

Und und und
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz