Browse Source

Added missing keys for WinCRT unit

Margers 10 months ago
parent
commit
0a23fc17cf
2 changed files with 217 additions and 49 deletions
  1. 6 0
      packages/graph/src/win32/graph.pp
  2. 211 49
      packages/graph/src/win32/wincrt.pp

+ 6 - 0
packages/graph/src/win32/graph.pp

@@ -1265,6 +1265,9 @@ begin
     wm_command:
       if assigned(commandmessagehandler) then
         WindowProcGraph:=commandmessagehandler(window,amessage,wparam,lparam);
+    wm_syskeyup,
+    wm_syskeydown,
+    {wm_syschar,}
     wm_keydown,
     wm_keyup,
     wm_char:
@@ -1381,6 +1384,9 @@ function WindowProcParent(Window: HWnd; AMessage:UInt; WParam : WParam;
 begin
   WindowProcParent := 0;
   case AMessage of
+    wm_syskeyup,
+    wm_syskeydown,
+    {wm_syschar,}
     wm_keydown,
     wm_keyup,
     wm_char:

+ 211 - 49
packages/graph/src/win32/wincrt.pp

@@ -149,61 +149,223 @@ unit WinCRT;
     function msghandler(Window: HWnd; AMessage:UInt; WParam : WParam; LParam: LParam): LResult; stdcall;
 
       begin
-         case amessage of
+         case AMessage of
            WM_CHAR:
              begin
-                addchar(chr(wparam));
+               if ctrlkey then
+               begin
+                 case wparam of
+                   VK_BACK:  addchar(chr(127));
+                   42,43,45,47: ; { num+,num-,num*,num/ ignore here }
+                   0:; {ignore, we can't have char 0}
+                   27:;{conflict with NumLock on, numpad3}
+                   28,29:; {ignore here, taken care in wm_keydown }
+                   30,31,46,48,49,57,127:; {ignore, invalid combination}
+                 else
+                   addchar(chr(wparam));
+                 end;
+               end else
+               if shiftkey then
+               begin
+                 case wparam of
+                   VK_TAB:  addextchar(#15);
+                 else
+                   addchar(chr(wparam));
+                 end;
+               end else
+                 addchar(chr(wparam));
              end;
-           WM_KEYDOWN:
+           WM_KEYDOWN,WM_SYSKEYDOWN:
              begin
-                case wparam of
-                   VK_LEFT:
-                     addextchar(#75);
-                   VK_RIGHT:
-                     addextchar(#77);
-                   VK_DOWN:
-                     addextchar(#80);
-                   VK_UP:
-                     addextchar(#72);
-                   VK_INSERT:
-                     addextchar(#82);
-                   VK_DELETE:
-                     addextchar(#83);
-                   VK_END:
-                     addextchar(#79);
-                   VK_HOME:
-                     addextchar(#71);
-                   VK_PRIOR:
-                     addextchar(#73);
-                   VK_NEXT:
-                     addextchar(#81);
-                   VK_F1..VK_F10:
-                     begin
-                        if ctrlkey then
-                          addextchar(chr(wparam+24))
-                        else if altkey then
-                          addextchar(chr(wparam+34))
-                        else
-                          addextchar(chr(wparam-11));
-                     end;
-                   VK_CONTROL:
-                     ctrlkey:=true;
-                   VK_MENU:
-                     altkey:=true;
-                   VK_SHIFT:
-                     shiftkey:=true;
-                end;
+               if altkey then
+               begin   {-------------  ATL  -------------}
+                 case wparam of
+                    VK_ESCAPE:      addextchar(#1);
+                    VK_OEM_3:       addextchar(#41);  { ~ }
+                    VK_1:           addextchar(#120);
+                    VK_2:           addextchar(#121);
+                    VK_3:           addextchar(#122);
+                    VK_4:           addextchar(#123);
+                    VK_5:           addextchar(#124);
+                    VK_6:           addextchar(#125);
+                    VK_7:           addextchar(#126);
+                    VK_8:           addextchar(#127);
+                    VK_9:           addextchar(#128);
+                    VK_0:           addextchar(#129);
+                    VK_OEM_MINUS:   addextchar(#130);
+                    VK_OEM_PLUS:    addextchar(#131);
+                    VK_BACK:        addextchar(#14);
+
+                    VK_Q:           addextchar(#16);
+                    VK_W:           addextchar(#17);
+                    VK_E:           addextchar(#18);
+                    VK_R:           addextchar(#19);
+                    VK_T:           addextchar(#20);
+                    VK_Y:           addextchar(#21);
+                    VK_U:           addextchar(#22);
+                    VK_I:           addextchar(#23);
+                    VK_O:           addextchar(#24);
+                    VK_P:           addextchar(#25);
+                    VK_OEM_4:       addextchar(#24);  { [ }
+                    VK_OEM_6:       addextchar(#25);  { ] }
+                    VK_RETURN:      addextchar(#28);
+
+                    VK_A:           addextchar(#30);
+                    VK_S:           addextchar(#31);
+                    VK_D:           addextchar(#32);
+                    VK_F:           addextchar(#33);
+                    VK_G:           addextchar(#34);
+                    VK_H:           addextchar(#35);
+                    VK_J:           addextchar(#36);
+                    VK_K:           addextchar(#37);
+                    VK_L:           addextchar(#38);
+                    VK_OEM_1:       addextchar(#39);  { ; }
+                    VK_OEM_7:       addextchar(#40);  { ' }
+                    VK_OEM_5:       addextchar(#43);  { \ }
+
+                    VK_Z:           addextchar(#44);
+                    VK_X:           addextchar(#45);
+                    VK_C:           addextchar(#46);
+                    VK_V:           addextchar(#47);
+                    VK_B:           addextchar(#48);
+                    VK_N:           addextchar(#49);
+                    VK_M:           addextchar(#50);
+                    VK_OEM_COMMA:   addextchar(#51);
+                    VK_OEM_PERIOD:  addextchar(#52);
+                    VK_OEM_2:       addextchar(#164); { / }
+                    VK_OEM_102:     addextchar(#86);  { < }
+
+                    VK_CLEAR:       addextchar(#154); { alt + numpad 5 }
+                    VK_ADD:         addextchar(#78);
+                    VK_SUBTRACT:    addextchar(#74);
+                    VK_MULTIPLY:    addextchar(#55);
+                    VK_DIVIDE:      addextchar(#164);
+
+                    {in dos/win32 this is Numeric ASCII entry, but add in anyway }
+                    VK_NUMPAD0:     addextchar(#162);
+                    VK_NUMPAD1:     addextchar(#159);
+                    VK_NUMPAD2:     addextchar(#160);
+                    VK_NUMPAD3:     addextchar(#161);
+                    VK_NUMPAD4:     addextchar(#155);
+                    VK_NUMPAD5:     addextchar(#154); { alt + numpad 5 }
+                    VK_NUMPAD6:     addextchar(#167);
+                    VK_NUMPAD7:     addextchar(#151);
+                    VK_NUMPAD8:     addextchar(#152);
+                    VK_NUMPAD9:     addextchar(#153);
+
+                    VK_DECIMAL:     addextchar(#163);
+                    VK_LEFT:        addextchar(#155);
+                    VK_RIGHT:       addextchar(#167);
+                    VK_DOWN:        addextchar(#160);
+                    VK_UP:          addextchar(#152);
+                    VK_INSERT:      addextchar(#162);
+                    VK_DELETE:      addextchar(#163);
+                    VK_END:         addextchar(#159);
+                    VK_HOME:        addextchar(#151);
+                    VK_PRIOR:       addextchar(#153);
+                    VK_NEXT:        addextchar(#161);
+                    VK_F1..VK_F10:  addextchar(chr(wparam-8));
+                    VK_F11..VK_F12: addextchar(chr(wparam+17));
+                  end;
+               end else
+               if ctrlkey then
+               begin   {-------------  CTRL  -------------}
+                 case wparam of
+                    49..57: addextchar(chr(wparam-47));
+                     48: addextchar(#11);
+                    189: addextchar(#12);
+                    187: addextchar(#13);
+                    222: addextchar(#40);
+                    186: addextchar(#39);
+                    192: addextchar(#41);
+                    188: addextchar(#51);
+                    190: addextchar(#52);
+                    191,111: addextchar(#149);
+                    106: addextchar(#150);
+                    109: addextchar(#142);
+                    107: addextchar(#144);
+                    110: addextchar(#147);
+                    VK_NUMPAD0:     addextchar(#146);
+                    VK_NUMPAD1:     addextchar(#117);
+                    VK_NUMPAD2:     addextchar(#145);
+                    VK_NUMPAD3:     addextchar(#118);
+                    VK_NUMPAD4:     addextchar(#115);
+                    VK_NUMPAD5:     addextchar(#143);
+                    VK_NUMPAD6:     addextchar(#116);
+                    VK_NUMPAD7:     addextchar(#119);
+                    VK_NUMPAD8:     addextchar(#141);
+                    VK_NUMPAD9:     addextchar(#132);
+
+                    VK_OEM_4:       addchar(#27);  { [ }
+                    VK_OEM_6:       addchar(#28);  { ] }
+                    VK_OEM_5:       addchar(#29);  { \ }
+                    VK_OEM_102:     addextchar(#86);  { < }
+
+                    VK_TAB:         addextchar(#148);
+                    VK_CLEAR:       addextchar(#143); { ctrl + numpad 5 }
+                    VK_LEFT:        addextchar(#115);
+                    VK_RIGHT:       addextchar(#116);
+                    VK_DOWN:        addextchar(#145);
+                    VK_UP:          addextchar(#141);
+                    VK_INSERT:      addextchar(#146);
+                    VK_DELETE:      addextchar(#147);
+                    VK_END:         addextchar(#117);
+                    VK_HOME:        addextchar(#119);
+                    VK_PRIOR:       addextchar(#132);
+                    VK_NEXT:        addextchar(#118);
+                    VK_F1..VK_F10:  addextchar(chr(wparam-18));
+                    VK_F11..VK_F12: addextchar(chr(wparam+15));
+                 end;
+               end else
+               if shiftkey then
+               begin   {-------------  SHIFT  -------------}
+                  case wparam of
+                    VK_CLEAR:       addextchar(#76); { shift + numpad 5 }
+                    VK_LEFT:        addextchar(#75);
+                    VK_RIGHT:       addextchar(#77);
+                    VK_DOWN:        addextchar(#80);
+                    VK_UP:          addextchar(#72);
+                    VK_INSERT:      addextchar(#82);
+                    VK_DELETE:      addextchar(#83);
+                    VK_END:         addextchar(#79);
+                    VK_HOME:        addextchar(#71);
+                    VK_PRIOR:       addextchar(#73);
+                    VK_NEXT:        addextchar(#81);
+                    VK_F1..VK_F10:  addextchar(chr(wparam-28));
+                    VK_F11..VK_F12: addextchar(chr(wparam+13));
+                  end;
+               end else
+               begin   {------------- no modif -------------}
+                 case wparam of
+                    VK_CLEAR:       addextchar(#76); {  numpad 5 }
+                    VK_LEFT:        addextchar(#75);
+                    VK_RIGHT:       addextchar(#77);
+                    VK_DOWN:        addextchar(#80);
+                    VK_UP:          addextchar(#72);
+                    VK_INSERT:      addextchar(#82);
+                    VK_DELETE:      addextchar(#83);
+                    VK_END:         addextchar(#79);
+                    VK_HOME:        addextchar(#71);
+                    VK_PRIOR:       addextchar(#73);
+                    VK_NEXT:        addextchar(#81);
+                    VK_F1..VK_F10:  addextchar(chr(wparam-53));
+                    VK_F11..VK_F12: addextchar(chr(wparam+11));
+                  end;
+               end;
+               {------------- common -------------}
+               case wparam of
+                 VK_CONTROL: ctrlkey:=true;
+                 VK_MENU:    altkey:=true;
+                 VK_SHIFT:   shiftkey:=true;
+               end;
              end;
-           WM_KEYUP:
+           WM_KEYUP,WM_SYSKEYUP:
              begin
-                case wparam of
-                   VK_CONTROL:
-                     ctrlkey:=false;
-                   VK_MENU:
-                     altkey:=false;
-                   VK_SHIFT:
-                     shiftkey:=false;
-                end;
+               case wparam of
+                 VK_CONTROL: ctrlkey:=false;
+                 VK_MENU:    altkey:=false;
+                 VK_SHIFT:   shiftkey:=false;
+               end;
              end;
          end;
          msghandler:=0;