Delphi-PRAXiS

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.

pistazie 12. Nov 2003 13:48

Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
 
Also ich hab das ganze mal jetzt eingefügt zu meiner Unit...

Die Anwendung erscheint zwar jetzt bei der Tastenkombination in den Vordergrund aber wenn ich mehrere Sachen hintereinander einfügen möchte, tut sich garnix, außer dass die Anwenung in den Vordergrung kommt...

Es wird das aktuelle aus der Zwischenablage nicht eingelesen wenn ich hintereinander kopiere und die Anwendung aufrufe (STR+ALT+T)...

Außerdem bringt der Compiler die Meldung:

[Hinweis] Unit1.pas(65): Auf 'bolOK' zugewiesener Wert wird niemals benutzt

Nun ja ich bin langsam am Verzweifeln :cry: aber ich bin dir dennoch sehr dankbar für deine Bemühungen

samson 12. Nov 2003 15:41

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

ich hatte mich jetzt nur damit beschäftigt, das Programm in den Vordergrund zu stellen und es entsprechend zu aktivieren.

Wenn Du den Inhalt der Zwischenablage in dem Memo haben willst musst Du noch folgendes Implementieren:

Delphi-Quellcode:
procedure TForm1.GetClipboard;
var
  clip:TClipboard;
begin
  clip := TClipboard.Create;
  try
    self.Memo1.Text := clip.AsText;
  finally
    clip.Free;
  end;
end;
Die Warnmeldung hat nix zu sagen. Du kannst das bolOK auch entsprechend aus dem Code entfernen. Es ist sinnvoll, wenn Du noch weitere Verarbeitungen durchführen möchtest.

In diesem Fall könnte bolOK = false sein, wenn der Key nicht Registriert wurde. Du kannst z. b. beim Programmstart eine entsprechende Meldung auf dem Bildschirm anzeigen.

Gruss


Samson



end;

pistazie 14. Nov 2003 07:26

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

habe diese Prozedur noch eingefügt in mein Programm, aber der Compiler kann mit GetClipborad nix anfangen:

[Fehler] Unit1.pas(64): Undefinierter Bezeichner: 'TClipboard'

Hab ich das falsch reingesetzt? :oops:

samson 14. Nov 2003 07:53

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

Sorry ich vergass, daß Du die Unit: Clipbrd noch einfügen musst.

Gruss


Samson

pistazie 14. Nov 2003 08:04

Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
 
Hab ich gemacht, kommt zwar keine Fehlermeldung mehr, aber es hat sich trotzdem nix geändert, wird trotzdem nix eingefügt :(

samson 14. Nov 2003 08:24

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

von wo rufst Du die procedure denn auf??? Im FormActivate oder in welchem Ereigniss? Die Clipboard-procedure die ich geschrieben habe, ist ja nur eine Procedure und muss ja auch irgendwo aufgerufen werden.

Wir haben doch zuvor noch den Shortcut mit einer case-Anweisung eingefügt, in der das Form im Vordergrund und Focussiert wird. Füge da doch den Aufgruf dieser Clipboard-Funktion ein.

Dann sollte folgendes gehen:

- Aufruf des Programms über einen Shortcut
- Zwischenablage in dem Memo einfügen.

Gruss

Samson

pistazie 14. Nov 2003 08:29

Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
 
ich hab die Prozedur in in die procedure.FormFuellen eingebaut, anstelle vom MemoEingabe.PasteFromClipboard. FormFuellen rufe ich einmal im WMTimeChange auf und dann noch im TForm1.FormActive...

Diese procedure TForm1.GetClipboard hat gar keine Übergabeparameter, kann sowas funktionieren?

samson 14. Nov 2003 08:54

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

das kanns nicht sein. Du bist hier in einem Delphi-Forum gelandet und nicht in einem Kontaktform. Es stört ungemein, wenn man son misst zwischen dem Sachlichen unterscheiden muss.

Halte bitte diese anmachen für andere Foren zurück.

Wenn pestazie mit Dir Kontakt haben möchte wird Sie Dich anschreiben oder sonst irgendwie in Kontakt treten.

Gruss

Samson

samson 14. Nov 2003 09:01

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

FormActivate wird nur beim Start des Programms einmal ausgeführt.

Hast Du mal nen Breakpoint auf die Funktion: FormFuellen gesetzt. Werden denn alle Befehle in der Function ausgeführt??? Teste das doch mal.

GetClipboard brauch keine Parameter. Warum denn auch? Ich erzeuge eine Instanz von der Zwischenablage und fülle das Object von Deiner Form.

Wenn DU eine allgemeine procedure: GetClipboard schreiben würdest, könntest du das Memo übergeben, aber ich denke das das hier keinen Sinn macht.

Gruss


Samson

Daniel B 14. Nov 2003 09:03

Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
 
@fletscher und pistazie

das sich weder der eine, noch die andere zurückhalten kann mit dem Flirt-lödsinn, das in diesem Thread absolut nichts zutun hat, habe ich alle überflüssigen Beiträge gelöscht!
Ich hoffe das jetzt endlich schluss ist, beide haben eine EMail-Addy im Profil hinterlassen, beide können die PN-Funktion nutzen.

Wenn das kein Ende hat, werde ich den Thread ohne weitere Vorwarnung schliessen und bedanken könnt Ihr Euch dann alle bei fletscher. :warn:

pistazie 14. Nov 2003 09:38

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

das hatte ich schon mal gemacht aber ich habe wieder einen Breakpoint auf Formfuellen gesetzt. Es werden in der Tat alle Befehle ausgeführt...

Ich habe den Aufruf GetClipboard auch in die Case-Anweisung eingebaut, keine Fehlermeldung. Die Tastenkombination reagiert trotzdem nicht :wall:

Und nun?

samson 14. Nov 2003 09:43

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

Ich pople nochmal in die Nase und mal gucken was raus kommt. Ich melde mich gleich wieder.


Gruss


Samson

samson 14. Nov 2003 10:14

Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe Dir mal ein Programm erstellt.

Folgende aufgaben werden gelöst:

- Aktivierung der Anwendung mit: [STRG]+[ALT]+[F12]
- Holt sich Text aus der Zwischenablage und fügt diesen in das Memo ein.
- Mit der Checkbox kann entschieden werden, ob ich den Text anhängen möchte oder nur diesen im Memo haben möchte.

Ich hoffe das das endlich weiterhilft.

Gruss


Samson

samson 3. Dez 2003 16:05

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

wurde das Problem eigentlich noch gelöst??

Gruss


Samson

pistazie 4. Dez 2003 07:10

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

ne du das konnte ich nicht mehr lösen, alle Lösungsvorschläge von dir haben bei mir irgendwie nicht so funktioniert... :gruebel:

Mein Abtleiter und ich haben uns deswegen überlegt dass die Anwendung nicht mit der Tastenmkombination sondern ganz normal mit Doppelklick mehrfach gestartet werden kann. Dann tuts nämlich schon das was es mit der Tastenkombination tun soll...

Aber trotzdem vielen dank nochmal für deine Bemühungen :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:27 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