AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Applikation Vordergrund

Ein Thema von dj2289 · begonnen am 19. Jan 2006 · letzter Beitrag vom 19. Jan 2006
Antwort Antwort
dj2289

Registriert seit: 18. Mai 2004
18 Beiträge
 
#1

Applikation Vordergrund

  Alt 19. Jan 2006, 17:01
Ich habe folgendes Problem, ich habe mir ein kleines Programm geschrieben, welches mir beim Aufruf von Programmen
hilft. Wenn ich nun F4 drücke erscheint auch die Applikation, aber der Focus ist immer noch (außer bei ganz wenigen Programme)
auf der Anwendung, welche ich vorher angeklickt habe. Hier mal der Quellcode, vielleicht hat jemand ne Idee, wie ich den Focus
auf meine Anwendung erzwingen kann:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellAPI, Menus, ExtCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Timer1: TTimer;
    Label1: TLabel;
    procedure FormHide(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormShow(Sender: TObject);

  procedure Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
     { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  key1: String;


implementation

const
  WH_KEYBOARD_LL = 13;

type
  PKbDllHookStruct = ^TKbDllHookStruct;
  TKbDllHookStruct = packed record
    vkCode: Cardinal;
    scanCode: Cardinal;
    flags: Cardinal;
    time: Cardinal;
  end;


var
  HookHandle: Cardinal;
{$R *.dfm}
// Tastatur HOOK
function LLKeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
key1:='';
  if nCode = HC_ACTION then
       with PKbDllHookStruct(lParam)^ do
        key1:=(Format(' %4.4x %2.2x %2.2x %2.2x ', [wParam, vkCode, scanCode, flags]));
  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
end;

// Abfrage
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if (Key=VK_RETURN)then
begin
if edit1.Text='ttttthen WinExec('C:\Programme\ttt.exe',1);
if edit1.Text='quitthen close();
edit1.Text:='';
Form1.Left:=-150;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
// Lässt das Fenster aus der unteren Programmleiste verschwinden
  ShowWindow( Application.Handle, SW_HIDE );
  SetWindowLong( Application.Handle, GWL_EXSTYLE,
                 GetWindowLong(Application.Handle, GWL_EXSTYLE) or
                 WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);
  ShowWindow( Application.Handle, SW_SHOW );
//-------------------//
Form1.Left:=-150
end;

procedure TForm1.FormHide(Sender: TObject);
begin
  if HookHandle <> 0 then begin
    UnhookWindowsHookEx(HookHandle);
    HookHandle := 0;
  end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  Form1.SetFocus;
  Edit1.Focused;
  key1:='';
  HookHandle := SetWindowsHookEx(WH_KEYBOARD_LL, LLKeyboardHookProc, hInstance, 0);
  if HookHandle = 0 then RaiseLastOSError;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if key1=' 0100 73 3E 00 then
  begin
  Form1.Left:=+600;
  Form1.SetFocus;
  label1.caption:=key1;
  end;
end;
end.
  Mit Zitat antworten Zitat
th_bone

Registriert seit: 16. Jun 2004
172 Beiträge
 
Delphi 2005 Professional
 
#2

Re: Applikation Vordergrund

  Alt 19. Jan 2006, 17:22
Hi,

ich habe hier mal eine function erweitert, da ich auch das Problem hatte, dass immer wieder
doch ein anderes fenster den Focus hatte - sie prüft ob das fenster auch wirklich im vordergrund ist und reagiert mit verschiedenen massnahmen darauf - sieht zwar sicherlich komisch und übertrieben aus aber seitdem funktioniert es...

Tschö

Ralf

Delphi-Quellcode:
function AppActivate(WindowName : PChar) : boolean;
var
 myhandle: thandle;
 i: byte;
begin
  i:=0;

  try
   Result:=true;
   WindowHandle:=FindWindow(nil,WindowName);

   If (WindowHandle=0) then EnumWindows(@EnumWindowsProc,Integer(PChar(WindowName)));
   If (WindowHandle<>0) then begin
     SendMessage(WindowHandle, WM_SYSCOMMAND, SC_HOTKEY, WindowHandle);
     SendMessage(WindowHandle, WM_SYSCOMMAND, SC_RESTORE, WindowHandle);
   end else Result:=false;
  except
   on Exception do Result:=false;
  end;

  // eigentlich sollte das hier schon reichen, aber dank Microschrott gibts ja für
  // alle befehle auch ausnahmen...

  delay(10);

  // Kontrolle ob Window auch wirklich im Vordergrund - versuche es nochmal max.20x
  while (windows.GetForegroundWindow<>windowhandle) and (i<20) do begin
    try
     if (i>15) then begin
       // wenn alles nichts hilft verkleinere zuerst alle Fenster
       myhandle := WindowHandle;
       while myhandle > 0 do begin
         if IsWindowVisible(myhandle) then PostMessage(myhandle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
         myhandle := GetNextWindow(myhandle, GW_HWNDNEXT);
       end;
     end;
     Result:=true;
     SendMessage(WindowHandle, WM_SYSCOMMAND, SC_HOTKEY, WindowHandle);
     SendMessage(WindowHandle, WM_SYSCOMMAND, SC_RESTORE, WindowHandle);
     windows.ShowWindow(WindowHandle, SW_ShowNormal);
     windows.SetForegroundWindow(WindowHandle);
     windows.SetFocus(WindowHandle);
    except
     on Exception do Result:=false;
    end;
    inc(i);
    delay(10);
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Applikation Vordergrund

  Alt 19. Jan 2006, 17:24
Warum machst du das mit einem Keyboard Hook? Ein Hotkey reícht doch vollkommen aus.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
dj2289

Registriert seit: 18. Mai 2004
18 Beiträge
 
#4

Re: Applikation Vordergrund

  Alt 19. Jan 2006, 18:55
Danke erstmal für den Code, nur wird bei mir der Fehler angezeigt, dass "WindowHandle" Undeklariert ist,
muss ich vielleicht eine Unit bei uses hinzufügen?
  Mit Zitat antworten Zitat
Benutzerbild von ManuMF
ManuMF

Registriert seit: 11. Jul 2005
1.016 Beiträge
 
Delphi 6 Personal
 
#5

Re: Applikation Vordergrund

  Alt 19. Jan 2006, 19:02
Nein, einfach in die Variablen der Funktion aufnehmen.

Delphi-Quellcode:
function AppActivate(WindowName : PChar) : boolean;
var
  myhandle: thandle;
  i: byte;
  WindowHandle: hWnd;
begin
...
Gruß,
ManuMF
Gruß,
ManuMF

Endlich hab ich was Positives an Vista entdeckt: Das mitgelieferte Mahjongg
  Mit Zitat antworten Zitat
dj2289

Registriert seit: 18. Mai 2004
18 Beiträge
 
#6

Re: Applikation Vordergrund

  Alt 19. Jan 2006, 19:07
Das erste Problem ist nun beseitigt, nun kommt der Fehler, dass @EnumWindowsProc nicht deklariert ist
  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 07:28 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