dev/diff/ ExampleDiff1


*** send_input_1.c  2023-01-09 09:55:51.183344200 +0000
--- send_input_4.c  2023-01-09 10:57:46.678617900 +0000
***************
*** 12,50 ****
  void SendKeys(const char* keys, size_t nkeys, ModifierKeys modifiers);

  int main() {
!   SendKeys("hello",5,0);
  }

  void SendKeys(const char* keys, size_t nkeys, ModifierKeys modifiers) {
!   // ignore modifiers for now
!   INPUT* inputs = (INPUT*)calloc(nkeys,sizeof(INPUT));
    ZeroMemory(inputs,2*nkeys*sizeof(INPUT));
!   for( int i=0; i<nkeys; i++ ) {
      char k = keys[i];
      if( k >= 'a' && k <= 'z' ) {
!       k -= 'a' - 'A';
!       inputs[2*i].type = INPUT_KEYBOARD;
!       inputs[2*i].ki.wVk = k;
!       inputs[2*i+1].type = INPUT_KEYBOARD;
!       inputs[2*i+1].ki.wVk = k;
!       inputs[2*i+1].ki.dwFlags = KEYEVENTF_KEYUP;
      } else if( k >= 'A' && k <= 'Z' ) {
!       inputs[2*i].type = INPUT_KEYBOARD;
!       inputs[2*i].ki.wVk = k;
!       inputs[2*i+1].type = INPUT_KEYBOARD;
!       inputs[2*i+1].ki.wVk = k;
!       inputs[2*i+1].ki.dwFlags = KEYEVENTF_KEYUP;
      } else if( k >= '0' && k <= '9' ) {
!       inputs[2*i].type = INPUT_KEYBOARD;
!       inputs[2*i].ki.wVk = k;
!       inputs[2*i+1].type = INPUT_KEYBOARD;
!       inputs[2*i+1].ki.wVk = k;
!       inputs[2*i+1].ki.dwFlags = KEYEVENTF_KEYUP;
!     } 
    }

!   UINT uSent = SendInput(nkeys*2, inputs, sizeof(INPUT));
!   if( uSent != nkeys*2 ) {
      printf("SendInput failed: 0x%x\n", HRESULT_FROM_WIN32(GetLastError()));
    }
  }
--- 12,137 ----
  void SendKeys(const char* keys, size_t nkeys, ModifierKeys modifiers);

  int main() {
!   char *str = "echo hello worldR";
!   printf("%s %d\n",str,strlen(str));
!   SendKeys(str,strlen(str),0);
!   //SendKeys("v",1,kCtrl|kShift);
  }

+ // alt l r
+ // ctrl l r
+ // lwin rwin
+ // back delete end insert home
+ // return tab
+ //
+ const WORD specials[26] = {
+   VK_MENU,VK_BACK,VK_CONTROL,VK_DELETE,VK_END, // A-E
+   VK_LMENU,VK_RMENU,VK_HOME,VK_INSERT,0, // FGHIJ
+   VK_LCONTROL,VK_RCONTROL,VK_LWIN,VK_RWIN,VK_APPS, // KLMNO
+   VK_CAPITAL,VK_PAUSE,VK_RETURN,VK_SNAPSHOT,VK_TAB,// PQRST
+   VK_PRIOR,VK_NEXT,// UV
+   VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN // WXYZ
+ };
+ 
  void SendKeys(const char* keys, size_t nkeys, ModifierKeys modifiers) {
!   INPUT* inputs = (INPUT*)calloc(nkeys+8,sizeof(INPUT));
    ZeroMemory(inputs,2*nkeys*sizeof(INPUT));
!   int j = 0;
!   if( modifiers & kShift ) { 
!     printf("shift\n"); 
!     inputs[j].type = INPUT_KEYBOARD;
!     inputs[j].ki.wVk = VK_SHIFT;
!     j++;
!   }
!   if( modifiers & kCtrl ) { 
!     printf("ctrl\n"); 
!     inputs[j].type = INPUT_KEYBOARD;
!     inputs[j].ki.wVk = VK_CONTROL;
!     j++;
!   }
!   if( modifiers & kAlt ) { 
!     printf("alt\n"); 
!     inputs[j].type = INPUT_KEYBOARD;
!     inputs[j].ki.wVk = VK_MENU;
!     j++;
!   }
!   if( modifiers & kMeta ) { 
!     printf("meta\n"); 
!     inputs[j].type = INPUT_KEYBOARD;
!     inputs[j].ki.wVk = VK_LWIN;
!     j++;
!   }
!   for(int i=0; i<nkeys; i++ ) {
      char k = keys[i];
+     printf("send %c == %x\n",k,k);
      if( k >= 'a' && k <= 'z' ) {
!       char s = k - ('a' - 'A');
!       printf("char '%c' == '%c' == %x\n",k,s,s);
!       inputs[j].type = INPUT_KEYBOARD;
!       inputs[j].ki.wVk = s;
!       inputs[j+1].type = INPUT_KEYBOARD;
!       inputs[j+1].ki.wVk = s;
!       inputs[j+1].ki.dwFlags = KEYEVENTF_KEYUP;
!       j += 2;
      } else if( k >= 'A' && k <= 'Z' ) {
!       char s = k-'A';
!       printf("special %d = %x\n",k,s);
!       k = specials[k-'A'];
!       if( k ) {
!         inputs[j].type = INPUT_KEYBOARD;
!         inputs[j].ki.wVk = k;
!         inputs[j+1].type = INPUT_KEYBOARD;
!         inputs[j+1].ki.wVk = k;
!         inputs[j+1].ki.dwFlags = KEYEVENTF_KEYUP;
!         j += 2;
!       }
      } else if( k >= '0' && k <= '9' ) {
!       inputs[j].type = INPUT_KEYBOARD;
!       inputs[j].ki.wVk = k;
!       inputs[j+1].type = INPUT_KEYBOARD;
!       inputs[j+1].ki.wVk = k;
!       inputs[j+1].ki.dwFlags = KEYEVENTF_KEYUP;
!       j += 2;
!     } else if( k == ' ' || k == '-' || k == '=' || k == ';' || k == '\'' || k == '#' || k == ',' || k == '.' || k == '/' || k == '\\' || k == '`' ) {
!       inputs[j].type = INPUT_KEYBOARD;
!       inputs[j].ki.wVk = k;
!       inputs[j+1].type = INPUT_KEYBOARD;
!       inputs[j+1].ki.wVk = k;
!       inputs[j+1].ki.dwFlags = KEYEVENTF_KEYUP;
!       j += 2;
!     }
!   }
!   if( modifiers & kMeta ) { 
!     printf("meta up\n"); 
!     inputs[j].type = INPUT_KEYBOARD;
!     inputs[j].ki.wVk = VK_LWIN;
!     inputs[j].ki.dwFlags = KEYEVENTF_KEYUP;
!     j++;
!   }
!   if( modifiers & kAlt ) { 
!     printf("alt up\n"); 
!     inputs[j].type = INPUT_KEYBOARD;
!     inputs[j].ki.wVk = VK_MENU;
!     inputs[j].ki.dwFlags = KEYEVENTF_KEYUP;
!     j++;
!   }
!   if( modifiers & kCtrl ) { 
!     printf("ctrl up\n"); 
!     inputs[j].type = INPUT_KEYBOARD;
!     inputs[j].ki.wVk = VK_CONTROL;
!     inputs[j].ki.dwFlags = KEYEVENTF_KEYUP;
!     j++;
!   }
!   if( modifiers & kShift ) { 
!     printf("shift up\n"); 
!     inputs[j].type = INPUT_KEYBOARD;
!     inputs[j].ki.wVk = VK_SHIFT;
!     inputs[j].ki.dwFlags = KEYEVENTF_KEYUP;
!     j++;
    }

!   UINT uSent = SendInput(j, inputs, sizeof(INPUT));
!   if( uSent != j ) {
      printf("SendInput failed: 0x%x\n", HRESULT_FROM_WIN32(GetLastError()));
    }
  }