Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi String -> Word (https://www.delphipraxis.net/71570-string-word.html)

TheAn00bis 17. Jun 2006 12:42


String -> Word
 
Hey,

Ich möchte den im Parameter der Anwendung übergebenen Virtual Keycode als Tastendruck simulieren.
Aber wie bekomme ich den Parameter, der ja ein String ist nach Word umgewandelt?

Gab es hier schon einige male, aber "strtoint" kann ja nicht klappen, da z.B. "VK_VOLUME_MUTE" nicht aus Zahlen besteht. ;)
Leider konnte ich über die Suche nichts gescheites finden, aber ich bin sicher ihr könnt mir helfen! :D

Matze 17. Jun 2006 12:47

Re: String -> Word
 
Zitat:

Zitat von TheAn00bis
Gab es hier schon einige male, aber "strtoint" kann ja nicht klappen, da z.B. "VK_VOLUME_MUTE" nicht aus Zahlen besteht. ;)

Ich verstehe nicht ganz. VK_VOLUME_MUTE ist eine Konstante, à la:

Delphi-Quellcode:
const
  VK_VOLUME_MUTE = 5
Nur als Beispiel, ich kenne den Wert nicht auswendig. Du müsstest ihn eigentlich mittels IntToStr anzeigen lassen können oder geht das nicht?

himitsu 17. Jun 2006 12:54

Re: String -> Word
 
Dafür gibt es nichts Fertiges. ('s gibt einfach zu wenige, die sowas brauchen)

Also selbermachen, wofür du nicht unbedingt wissen mußt, welcher Wert in dem Word steckt.


z.B.
Delphi-Quellcode:
If ParamStr(1) = 'VK_VOLUME_MUTE' Then W := VK_VOLUME_MUTE
Else If ParamStr(1) = 'VK_A' Then W := VK_A
...

TheAn00bis 17. Jun 2006 12:59

Re: String -> Word
 
Zitat:

Zitat von Matze
Zitat:

Zitat von TheAn00bis
Gab es hier schon einige male, aber "strtoint" kann ja nicht klappen, da z.B. "VK_VOLUME_MUTE" nicht aus Zahlen besteht. ;)

Ich verstehe nicht ganz. VK_VOLUME_MUTE ist eine Konstante, à la:

Delphi-Quellcode:
const
  VK_VOLUME_MUTE = 5
Nur als Beispiel, ich kenne den Wert nicht auswendig. Du müsstest ihn eigentlich mittels IntToStr anzeigen lassen können oder geht das nicht?

Stimmt, ich habe das etwas falsch gesehen.

Ich kann die Zahl über "inttostr", wie du gesagt hast herausfinden, aber das bringt mir nicht viel, da ich nicht von einem (im Parameter übergebenen) String "VK_VOLUME_MUTE" auf den Bezeichner "VK_VOLUME_MUTE" einer Konstanten komme, oder?

Zitat:

Zitat von himitsu
Dafür gibt es nichts Fertiges. ('s gibt einfach zu wenige, die sowas brauchen)

Also selbermachen, wofür du nicht unbedingt wissen mußt, welcher Wert in dem Word steckt.


z.B.
Delphi-Quellcode:
If ParamStr(1) = 'VK_VOLUME_MUTE' Then W := VK_VOLUME_MUTE
Else If ParamStr(1) = 'VK_A' Then W := VK_A
...

Daran hatte ich natürlich auch als erstes gedacht und das auch so umgesetzt. Aber das ist so furchtbar undynamisch und unflexibel. Ist das wirklich der einzige Weg?
Alles was ich schaffen müsste ist ja "dynamisch" von einem String auf die "Virtual Key"-Konstante mit dem Bezeichner zu kommen, welcher im String steht.

himitsu 17. Jun 2006 13:10

Re: String -> Word
 
Ja, sowas ist der einzige Weg, denn wo willst du den die nötigen Werte (Word und String) sonst herbekommen?

Also 'ne Liste mit den Strings und den zugehörigen Words brauchst du so, oder so.

Aber wie du diese Liste verwaltest, das ist 'ne andere Sache :zwinker:

- mit den IF's
- am Schnellsten ginge eine Art Hashverfahren
es gibt ja nur 'ne "geringe Anzahl an mölichen Werten und wenn es keine doppelten "Hash's" gibt, dann könnte man auch locker damit arbeiten ... also ein bestimmter Hash = ein bestimmes Word
- ein Array
- 'ne Datei, wo String und die Zahl drinsteht
...

Delphi-Quellcode:
Case MakeHash(ParamStr(1) of
  123: Result := VK_A;
  456: Result := VK_B;
  789: Result := VK_C;
  ...
End;
Delphi-Quellcode:
Const X: Array[0..123] of Record
    S: String;
    W: Word;
  End = (
    (S: 'VK_A'; W: VK_A),
    (S: 'VK_B'; W: VK_B),
    (S: 'VK_C'; W: VK_C)
    ...
  );

For i := 0 to High(X) do
  If ParamStr(1) = X[i].S Then Result := X[i].W;
...

TheAn00bis 17. Jun 2006 13:25

Re: String -> Word
 
Die Idee mit der Datei gefällt mir.

Aber mir fällt gerade ein, dass es mir eigentlich auch reichen würde statt dem "Virtual Keycode" einfach die Zahl der Konstanten als Parameter zu übergeben: Also ich übergebe dem Programm die Zahl "173" (=VK_VOLUME_MUTE) und es schaltet auf Mute.
So ist das Programm dynamisch und ich muss nur die Zahlen der Konstanten vorher herausfinden.

So funktioniert das wunderbar:
Delphi-Quellcode:
procedure TForm1.FormActivate(Sender: TObject);

  function filter(pString: String): String; //entfernt den Bindestrich vor dem Parameter
  begin
    result := copy(pString,2,length(pString));
  end;

begin
 PostKeyEx32(strtoint(filter(ParamStr(1))) , [], False); //siehe [url]http://www.swissdelphicenter.ch/de/showcode.php?id=220[/url]
 close;
end;
Danke euch! :)

Edit: Man sollte das "close" nicht sofort danach ausführen, sonst funktioniert es nicht.

himitsu 17. Jun 2006 13:43

Re: String -> Word
 
Ich sag's ma so, es steht nirgendwo geschrieben, daß man unbedingt 'nen Bindestinch vomt Parameter braucht, oder einen Slash ;)

/param
-param
param

Aber wenn du unbedingt 'nen "-" haben willst ... so gehst auch ^^
Delphi-Quellcode:
PostKeyEx32(-StrToInt(ParamStr(1)) , [], False);
Sleep(...); // ???
Close;

TheAn00bis 17. Jun 2006 14:43

Re: String -> Word
 
Zitat:

Zitat von himitsu
Aber wenn du unbedingt 'nen "-" haben willst ... so gehst auch ^^
Delphi-Quellcode:
PostKeyEx32(-StrToInt(ParamStr(1)) , [], False);

Haha, genial! Ich bin gar nicht draufgekommen, dass ich den Parameterbindestrich + den Integerwert als mit negativem Vorzeichen behafteten Integer interpretieren kann!

Das mit Sleep habe ich auch schon versucht, es bringt leider gar nichts, aber ich denke dafür mache ich einen neuen Thread auf.

Edit: Mit "sleep" funktioniert es nicht, aber mit negaHs Delay!

himitsu 17. Jun 2006 15:58

Re: String -> Word
 
^^

Was das Sleep/Delay angeht ... vermutlich arbeitet PostKeyEx32 über WindowsMessages, welche erst abgearbeitet werden müssen.

Kannst es ja mal mit Application.ProgressMessages versuchen (statt Delay).
Hagen's Delay ruft dieses sozusagen intern doch auch auf und wartet zusätzlich noch 'ne gewisse Zeit.

TheAn00bis 17. Jun 2006 16:04

Re: String -> Word
 
Zitat:

Zitat von himitsu
^^

Was das Sleep/Delay angeht ... vermutlich arbeitet PostKeyEx32 über WindowsMessages, welche erst abgearbeitet werden müssen.

Kannst es ja mal mit Application.ProgressMessages versuchen (statt Delay).
Hagen's Delay ruft dieses sozusagen intern doch auch auf und wartet zusätzlich noch 'ne gewisse Zeit.

Ja, du hast Recht. Mit Application.ProcessMessages kann ich mir die Verzögerung sparen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:20 Uhr.
Seite 1 von 2  1 2      

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