Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   WM_KEYDOWN wird nicht ausgelößt (https://www.delphipraxis.net/160316-wm_keydown-wird-nicht-ausgeloesst.html)

EWeiss 7. Mai 2011 04:51

WM_KEYDOWN wird nicht ausgelößt
 
Habe ein paar probleme mit meinen Keytasten

VK_RIGHT, VK_LEFT, VK_RETURN
werden einfach nicht aufgelößt.

Habe jetzt schon VK_SHIFT für VK_RETURN eingesetzt.
Und muss jetzt feststellen das die beiden VK_RIGHT, VK_LEFT auch nicht funktionieren.

Diese hier funktionieren alle..
Delphi-Quellcode:
procedure PlayStopKeyNote(KeyNote: Integer; Chord: TChord; State: BOOL);
var
  NewNote: Integer;

begin

  case KeyNote of
    ord('Y'):     NewNote := 12; // Basenote C1
    ord('S'):     NewNote := 13; // C1#
    ord('X'):     NewNote := 14; // D1
    ord('D'):     NewNote := 15; // D1#
    ord('C'):     NewNote := 16; // E1
    ord('V'):     NewNote := 17; // F1
    ord('G'):     NewNote := 18; // F1#
    ord('B'):     NewNote := 19; // G1
    ord('H'):     NewNote := 20; // G1#
    ord('N'):     NewNote := 21; // A1
    ord('J'):     NewNote := 22; // A1#
    ord('M'):     NewNote := 23; // H1
    VK_OEM_COMMA: NewNote := 24; // C2
    ord('L'):     NewNote := 25; // C2#
    VK_OEM_PERIOD: NewNote := 26; // D2
    VK_OEM_3:     NewNote := 27; // D2#
    VK_OEM_MINUS: NewNote := 28; // E2
    ord('Q'):     NewNote := 29; // F2
    ord('2'):     NewNote := 30; // F2#
    ord('W'):     NewNote := 31; // G2
    ord('3'):     NewNote := 32; // G2#
    ord('E'):     NewNote := 33; // A2
    ord('4'):     NewNote := 34; // A2#
    ord('R'):     NewNote := 35; // H2
    ord('T'):     NewNote := 36; // C3
    ord('6'):     NewNote := 37; // C3#
    ord('Z'):     NewNote := 38; // D3
    ord('7'):     NewNote := 39; // D3#
    ord('U'):     NewNote := 40; // E3
    ord('I'):     NewNote := 41; // F3
    ord('9'):     NewNote := 42; // F3#
    ord('O'):     NewNote := 43; // G3
    ord('0'):     NewNote := 44; // G3#
    ord('P'):     NewNote := 45; // A3
    VK_OEM_4:     NewNote := 46; // A3#
    VK_OEM_1:     NewNote := 47; // H3
    VK_OEM_PLUS:  NewNote := 48; // C4
    else
      exit;
  end;
  if State then
    StartNote(NewNote, integer(Chord))
  else
  StopNote(NewNote, integer(Chord));

end;
Was läuft denn hier wieder schief.

turboPASCAL 7. Mai 2011 05:27

AW: WM_KEYDOWN wird nicht ausgelößt
 
Zitat:

Zitat von EWeiss (Beitrag 1099440)
Was läuft denn hier wieder schief.

Tja, keine Ahnung.

Wie und wo bekommt denn PlayStopKeyNote() seine KeyNotes ?
Nutzt du Hooks ?

EWeiss 7. Mai 2011 05:31

AW: WM_KEYDOWN wird nicht ausgelößt
 
Zitat:

Zitat von turboPASCAL (Beitrag 1099441)
Zitat:

Zitat von EWeiss (Beitrag 1099440)
Was läuft denn hier wieder schief.

Tja, keine Ahnung.

Wie und wo bekommt denn PlayStopKeyNote() seine KeyNotes ?
Nutzt du Hooks ?

PlayStopKeyNote hat mit dem Problem nichts zu tun sondern soll lediglich zeigen welche Key's funktionieren
Die Keynotes werden alle in WM_KEYDOWN übergeben.
Hatte ich aber auch geschrieben.

Diese gehen nicht!
VK_RIGHT, VK_LEFT, VK_RETURN

Ob mit oder ohne Focus der Anwendung.

Hooks benutze ich keine.

gruss

turboPASCAL 7. Mai 2011 05:34

AW: WM_KEYDOWN wird nicht ausgelößt
 
Anders gefragt, wie schaut dein WM_KEYDOWN aus ?

EWeiss 7. Mai 2011 05:37

AW: WM_KEYDOWN wird nicht ausgelößt
 
Zitat:

Zitat von turboPASCAL (Beitrag 1099443)
Anders gefragt, wie schaut dein WM_KEYDOWN aus ?

So..
Auskommentierte ist was nicht an keys funktioniert.
Delphi-Quellcode:
    WM_KEYDOWN:
    begin
      case wp of
        VK_SHIFT:
          begin
            if not Sustain then
              SetController(64, 127, Channel);
          end;
        {VK_LEFT:
          SendMessage(WinHandle, WM_COMMAND, ID_BTN_INSTL, 0);
        VK_RIGHT:
          SendMessage(WinHandle, WM_COMMAND, ID_BTN_INSTR, 0);}
      end;

      if SKAERO_GetCheckButtonStatus(SKAERO_GetMainItem(MainHandle, ID_USEKEY)) =
        True then
        if wp <> lastnote then
          if OnState then
            // Note von der Tastatur spielen
            PlayStopKeyNote(wp, TChord(Chord), True);
      lastnote := wp;
    end;
    WM_KEYUP:
    begin
      case wp of
        VK_SHIFT:
          begin
            if not Sustain then
              SetController(64, 0, Channel);
          end;
      end;

      if SKAERO_GetCheckButtonStatus(SKAERO_GetMainItem(MainHandle, ID_USEKEY)) =
        True then
        if OnState then
        begin
          // zuletzt gespielte Note von der Tastatur stoppen
          PlayStopKeyNote(wp, TChord(Chord), False);
          lastnote := -1;
        end;
    end;
Komme gar nicht erst in WM_KEYDOWN rein mit den angegebenen Keys
Die anderen gehn.


gruss

turboPASCAL 7. Mai 2011 05:44

AW: WM_KEYDOWN wird nicht ausgelößt
 
Öhm und wo wird denn da der Keycode geholt ?

Also ala:
Delphi-Quellcode:
WM_KEYDOWN:
    begin
      myKeyCode := wParam
    end;

Ist doch wohl bei dir nonVCL oder ?

EWeiss 7. Mai 2011 05:46

AW: WM_KEYDOWN wird nicht ausgelößt
 
Zitat:

Zitat von turboPASCAL (Beitrag 1099445)
Öhm und wo wird denn da der Keycode geholt ?

Also ala:
Delphi-Quellcode:
WM_KEYDOWN:
    begin
      myKeyCode := wParam
    end;

Ist doch wohl bei dir nonVCL oder ?

Jo..
Delphi-Quellcode:
case wp of
        VK_SHIFT:
Aber er kommt nicht in WM_KEYDOWN rein das ist mein Problem

Also nicht das wir jetzt was verwechseln..
Ich meine nicht die Keys also Tasten auf dem Piano..

Sondern die von meiner Tastatur! ;)

gruss

madtom 7. Mai 2011 05:54

AW: WM_KEYDOWN wird nicht ausgelößt
 
Hallo EWeiss,

ist es nonVCL? Ich habe es sonst in der VCL durchgespielt und es funktioniert: (ich habe es so angepasst, dass mir die Form1.Caption die gedrückten Tasten anzeigt)

Delphi-Quellcode:
procedure PlayStopKeyNote(KeyNote: Integer; State: TShiftState);
begin
  case KeyNote of
    VK_LEFT:
      Form1.Caption := 'Left'; // Left
    VK_RIGHT:
      Form1.Caption := 'Right'; // Right
    VK_UP:
      Form1.Caption := 'Up'; // Up
    VK_DOWN:
      Form1.Caption := 'Down'; // Down
    VK_RETURN:
      Form1.Caption := 'Return'; // Return
  else
    Exit;
  end;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  PlayStopKeyNote(Key, Shift);
end;
Thomas :)

EWeiss 7. Mai 2011 05:59

AW: WM_KEYDOWN wird nicht ausgelößt
 
Zitat:

Zitat von madtom (Beitrag 1099448)
Hallo EWeiss,

ist es nonVCL? Ich habe es sonst in der VCL durchgespielt und es funktioniert: (ich habe es so angepasst, dass mir die Form1.Caption die gedrückten Tasten anzeigt)

Delphi-Quellcode:
procedure PlayStopKeyNote(KeyNote: Integer; State: TShiftState);
begin
  case KeyNote of
    VK_LEFT:
      Form1.Caption := 'Left'; // Left
    VK_RIGHT:
      Form1.Caption := 'Right'; // Right
    VK_UP:
      Form1.Caption := 'Up'; // Up
    VK_DOWN:
      Form1.Caption := 'Down'; // Down
    VK_RETURN:
      Form1.Caption := 'Return'; // Return
  else
    Exit;
  end;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  PlayStopKeyNote(Key, Shift);
end;
Thomas :)

Lieber madtom
Danke für dein Beispiel
Aber ich sagte schon alle Tasten funktionieren nur diese 5 nicht.

Wenn ich den Focus erzwinge..

Delphi-Quellcode:
        // Focus für Tasten Eingaben
        ID_USEKEY:
        begin
          if UseKey then
            SKAERO_SetCheckButtonStatus(SKAERO_GetMainItem(MainHandle, ID_USEKEY), False);

          UseKey := not UseKey;
          SetFocus(MainHandle);
        end;
Dann funktionieren alle Tasten die ich angegeben habe um auf dem Piano zu spielen
Aber nicht VK_RIGHT, VK_LEFT, VK_UP, VK_DOWN, VK_RETURN

gruss

turboPASCAL 7. Mai 2011 06:13

AW: WM_KEYDOWN wird nicht ausgelößt
 
@EWeiss, ja aber irgend wo musst doch "wp" den Tastencoder erhalten vom WM_KEYDOWN oder nicht ?

madtom 7. Mai 2011 06:33

AW: WM_KEYDOWN wird nicht ausgelößt
 
Hallo EWeiss,

Für mich liest sich das so, als ob etwas noch mit dem Key Event Handling noch im Argen ist. Manche Botschaften (ich glaube auch VK_RETURN...) werden unter Umständen an das ParentControl weitergeleitet und müssen dann anders gehandelt werden. Frag doch mal unsere Spezialisten (Daniel, Luckie ...)

Viel Erfolg

Thomas :-D

EWeiss 7. Mai 2011 06:43

AW: WM_KEYDOWN wird nicht ausgelößt
 
Zitat:

Zitat von turboPASCAL (Beitrag 1099451)
@EWeiss, ja aber irgend wo musst doch "wp" den Tastencoder erhalten vom WM_KEYDOWN oder nicht ?

Danke das wars..
Bin davon ausgegangen, da es mit allen Tasten funktioniert hat bisher, das ich die Tasten weiterhin über die Main WinProc verwalten kann.
So wie es aussieht geht es aber nicht.

Deshalb habe ich die beiden Messagen jetzt in meiner SuperClassing WinProc durchgeschleift..

Jetzt funktionieren die Keys.
Up,Down,left,right und enter scheinen keine WM_KEYDOWN Message auszulösen
deshalb war es schon richtig das ich meine Funktionen in WM_KEYUP weiterleite und verarbeite.
Muss das also wieder ändern.

Delphi-Quellcode:
      WM_KEYDOWN:
        SendMessage(GetParent(WinHandle), WM_KEYDOWN, wp, lp);

      WM_KEYUP:
        SendMessage(GetParent(WinHandle), WM_KEYUP, wp, lp);
gruss

Moebius97 14. Feb 2012 10:08

AW: WM_KEYDOWN wird nicht ausgelößt
 
Hi hi,
ist zwar schon durch, aber fürs protokoll:
jemand hat woanders ausprobiert, das die bezeichneten Tasten mit WM_SYSKEYDOWN auch durchgereicht werden. Das übenrimmt dann also ALLE Tasten...
:wink:
Mario

lbccaleb 16. Jan 2013 04:32

AW: WM_KEYDOWN wird nicht ausgelößt
 
Zitat:

Zitat von Moebius97 (Beitrag 1150977)
Hi hi,
ist zwar schon durch, aber fürs protokoll:
jemand hat woanders ausprobiert, das die bezeichneten Tasten mit WM_SYSKEYDOWN auch durchgereicht werden. Das übenrimmt dann also ALLE Tasten...
:wink:
Mario

Ist zwar schon ein bisschen her, aber will trotzdem nochmal dazu was sagen:
Also das es an WM_SYSKEYDOWN liegt ist eher unwahrscheinlich.

Ich denke das Emil bestimmt in dem Message Handler auf IsDialogMessage zugreift?!
Wenn dem so ist, musst du VK_RETURN und die Pfeiltasten mit WM_GETDLGCODE abfangen!


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