Delphi-PRAXiS
Seite 1 von 2  1 2      

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 ?


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