Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Keine Aktivierung der Form bei Aufruf über Tastenkombination (https://www.delphipraxis.net/11696-keine-aktivierung-der-form-bei-aufruf-ueber-tastenkombination.html)

pistazie 12. Nov 2003 08:03


Keine Aktivierung der Form bei Aufruf über Tastenkombination
 
Hi,

ich habe eine Applikation in Delphi programmiert, welche man über eine simple Tastenkombination aufrufen soll. Der Benutzer soll von einer anderen Anwendung Zeilen in die Zwischenablage kopieren und dann nur noch über die Tastenkombination meine Applikation aufrufen. Beim Aufruf wird in ein Memofeld das kopierte eingefügt und bearbeitet...

Beim ersten Aufruf tut es schon, aber wenn der Benutzer mehrere Zeilen bearbeiten soll, soll die Applikation mehrmals über die Tastenkombination aufgerufen ohne jedes mal beendet zu werden, aber das Memofeld wird nicht aktualisiert, so wie es sein müsste. Aber wenn man die Anwendung ganz normal anklickt dann schon...

Das ganze mache ich mit Windows-Botschaftbehandlung: mit SendMessage, also falls die Anwendung noch mal aufgerufen werden soll, sollen die Memofelder geleert und mit den aktuellen Daten der Zwischenablage gefüllt werden. Wie gesagt über Mausklick klappt das hervorragend, aber nicht über einen Aufruf mit Tastenkombination :wall:

Könnte mir vielleicht jemand sagen, woran das liegt? Liegt es an meinem Windows98?

samson 12. Nov 2003 09:17

Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
 
Hallo.

Ich stelle mir die Frage, über welche API-Funktionen du versuchst Deine Delphi-Application zu aktivieren.

Verwendest Du nur SendMessage() oder auch BringToFront und oder SetFocus usw...

Gruss


Samson

pistazie 12. Nov 2003 09:22

Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
 
Ich mache das mit SendMessage, welche ich in die Initalisierung vom Mutex eingebaut habe...

Es klappt ja eingentlich auch aber dafür muss man die Anwendung auf dem Desktop anklicken. Es ist die blöde Tastenkombination : STRG + ALT + T

sakura 12. Nov 2003 10:40

Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
 
Privates bitte via PN - hat im Thread nun echt nichts verloren :warn:

...:cat:...

P.S.: Ich flirte auch gerne, aber :mrgreen:

pistazie 12. Nov 2003 10:41

Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
 
Nein ich hab das Problem noch nicht gelöst, habe auch kaum Zeit dafür :(

Du hast mir garnicht geschrieben woher du kommst, brauch ein wenig Input, damit ich entscheide, ob ich mit dir Kaffee trinken gehe :roll:

pistazie 12. Nov 2003 10:45

Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
 
Ups tschuldigung, war keine Absicht :oops:

samson 12. Nov 2003 12:20

Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
 
Hallo pistazie.

Abgesehen von Deiner Flirtaffäre versuche ich eine Lösung zu finden.

Wie wäre es, wenn Du deine Application hierdran hängst, damit wir es uns mal angucken können und uns eine besser Vorstellung zur Application machen können.

Gruss


Samson

pistazie 12. Nov 2003 12:27

Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke das ist lieb von dir :)

Weiß garnicht ob man die ganze Unit hier anhängen kann, ich probiers einfach :gruebel:

pistazie 12. Nov 2003 12:31

Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
 
ich glaube so ist es besser:

Delphi-Quellcode:
//Nachricht mit Keycode 0 wird von Anwendung empfangen://
procedure TForm1.WMTimeChange(var Message: TMessage);
var
   Result, Gesamthex, Hexawert, Hinten, Vorne, Ausgabe : String;
begin
   if Chr(Message.WParam) = #0 then
   begin
      MemoEingabe.Text := '';
      MemoAusgabe.Text := '';
      Formfuellen(Result,Gesamthex,Hexawert,Vorne,Hinten,Ausgabe);
   end
   else
      inherited;
end;

//##############################################################################
//Stand: 17.10.2003
//Autor:
//Beschr:Wandelt den Hexadezimalen Wert in den entsprechenden dezimalen Ascii-Code und
//       diesen in das entsprechende Ascii-Zeichen
//Version: 1.1
//Global: -
//Input: Gesamthex,Hexawert
//Output:
//Result:
//Exception:
function TForm1.HexToAsciiToZeichen(Gesamthex,Hexawert : String) : String;
var
   Asciicode, Gesamtwort : String;
   AsciiInt,PosLeer, PosD, PosA : Integer;
   Buchstabe : String;
begin
   Gesamthex := MemoEingabe.Text;
   Gesamtwort := '';
   repeat
      PosLeer := Pos(' ', Gesamthex);
      if (PosLeer > 0) then
      begin
         Delete(Gesamthex,PosLeer,1);
      end;
      PosD := Pos(#$D, Gesamthex);
      if (PosD > 0) then
      begin
         Delete(Gesamthex,PosD,1);
      end;
      PosA := Pos(#$A, Gesamthex);
      if (PosA > 0) then
      begin
         Delete(Gesamthex,PosA,1);
      end;
   until (PosLeer = 0);

   repeat
      //Aus dem gesamten String(Gesamthex) sollen in 2er-Zeichen(Hexawert)  Teilstrings extrahiert werden:
      Hexawert := Copy(Gesamthex, 1, 2);
      if copy(Hexawert,2,2) <> '' then
      begin
         //Umwandeln Hexadez zu Asciicode(Dez):
         Asciicode := IntToStr(StrToInt('$' + Hexawert));
         AsciiInt := StrToInt(Asciicode);
         if (AsciiInt >= 32) then
         begin
            //Umwandeln Asciicode zu Asciizeichen:
            Buchstabe := Chr(AsciiInt);
         end
         else
         begin
            Buchstabe := ' ';
         end;
         Gesamtwort := Gesamtwort + Buchstabe;
         Delete(Gesamthex, 1, 2);
         Result := Gesamtwort;
         end
   until (Gesamthex = '');
end;


//Form mit Inhalt://
procedure TForm1.Formfuellen(Result,Gesamthex,Hexawert,Vorne,Hinten : String; var Ausgabe : String);
var
   Stringlaenge,PosSeparator : Integer;
begin
   MemoEingabe.PasteFromClipboard;
   Result := HexToAsciiToZeichen(Gesamthex,Hexawert);
   Stringlaenge := Length(Result);
   repeat
      PosSeparator := Pos('/', Result);
      if (PosSeparator > 0) then
      begin
         Vorne := copy(Result,1,PosSeparator-1);
         Hinten := copy(Result,PosSeparator+1,Stringlaenge);
         Delete(Result, PosSeparator,1);
         Result := Hinten;
         Ausgabe := Vorne + #13#10 + Hinten;
         Result := Ausgabe;
      end;
   until (PosSeparator = 0);
   MemoAusgabe.Text := Result;
end;

//Gesamtablauf://
procedure TForm1.FormActivate(Sender: TObject);
var
   Result, Gesamthex, Hexawert, Hinten, Vorne, Ausgabe : String;
   begin
      MemoEingabe.Text := '';
      MemoAusgabe.Text := '';
      Formfuellen(Result,Gesamthex,Hexawert,Vorne,Hinten,Ausgabe);
//   ShowMessage('Hallo');
   end;

//Mehrfachstart verhindern://
var
   mHandle: THandle;
   ustrProgName : String;


Initialization
begin
   //ShowMessage(Application.ExeName);
   ustrProgName := 'Terminal.exe' + #0;
   //ustrProgName := Application.ExeName + #0;
  mHandle := CreateMutex(nil,True,@ustrProgName[1]);
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    //Nachricht versenden Keycode 0:
    SendMessage(HWND_BROADCAST, WM_TIMECHANGE, 0, 0);
    //Anwendung läuft bereits:
    //showMessage('Anwendung läuft bereits!');
    //Beendet Anwendung:
    Halt;
   end;
end;

Finalization
begin
   if mHandle <> 0 then CloseHandle(mHandle);
end;

end.
[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]

samson 12. Nov 2003 13:03

Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
 
Hallo,

So ich habs füge mal folgenden Code in deine Unit ein.

Typ für Hotkey:

Delphi-Quellcode:
type
  TWMHotkey = record
    Msg: Cardinal;
    idHotKey: Word;
    Modifiers: Integer;
    VirtKey: Integer;
  end;
Constante für den Key (zum aktivieren deiner Application);

Delphi-Quellcode:
const
  ID = $FF;
Tastenkürzel registrieren für diese Anwendung:
Delphi-Quellcode:
    procedure FormCreate(Sender: TObject);
Neue Private procedure zum Bearbeiten des Shortcuts;
Delphi-Quellcode:
procedure WMHotKey(var Msg: TWMHotKey); Message WM_HOTKEY;
Implementierung von FormCreate(...) und WMHotKey(...)
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  bolOK: longbool;
begin
  bolOK:=RegisterHotKey(self.Handle, ID, MOD_Alt+MOD_CONTROL+MOD_SHIFT, vk_escape);//Ord('Q')
end;

procedure TForm1.WMHotKey(Var Msg: TWMHotkey);
begin
  case Msg.IdHotKey of
    ID: begin Application.BringToFront; Windows.SetFocus(self.Handle); end;
    ID+1: caption:='es ist immer noch alles klar';
    // Abhängig von der ID wird entschieden, was getan werden soll.
  end;
  inherited;
end;
In diesem Fall habe ich jetzt einen ganz komischen HotKey ausprobiert. Ich denke das Du bestimmt einen einfacheren findest.

Dein Code müsste ungefähr so aussehen:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type
  TWMHotkey = record
    Msg: Cardinal;
    idHotKey: Word;
    Modifiers: Integer;
    VirtKey: Integer;
  end;

const
  ID = $FF;

type
  TForm1 = class(TForm)
    GroupBox3: TGroupBox;
    Memo1: TMemo;
    BitBtn2: TBitBtn;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure WMHotKey(var Msg: TWMHotKey); Message WM_HOTKEY;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  bolOK: longbool;
begin
  bolOK:=RegisterHotKey(self.Handle, ID, MOD_Alt+MOD_CONTROL+MOD_SHIFT, vk_escape);//Ord('Q')
end;

procedure TForm1.WMHotKey(Var Msg: TWMHotkey);
begin
  case Msg.IdHotKey of
    ID: begin Application.BringToFront; Windows.SetFocus(self.Handle); end;
    ID+1: caption:='es ist immer noch alles klar';
    // Abhängig von der ID wird entschieden, was getan werden soll.
  end;
  inherited;
end;


end.
Gruss


Samson.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:27 Uhr.
Seite 1 von 3  1 23      

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