Проблема с keybd_event

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Tip.the.besT, 26 Mar 2012.

  1. Tip.the.besT

    Tip.the.besT Member

    Joined:
    24 Jun 2009
    Messages:
    267
    Likes Received:
    10
    Reputations:
    4
    Code:
    var
    s:string;
      I: Integer;
    begin
    s:='Nik';
    sleep(3000);
     for I := 1 to length(s) do
     begin
     keybd_event(Ord(s[i]), 0, 0, 0);
     keybd_event(Ord(s[i]), 0, KEYEVENTF_KEYUP, 0);
     end;
     end;
    end.
    Данный код выводит следующие - т9+. А если просто вписываю буквы, то всё нормально. Я так понимаю строку здесь использовать нельзя? Тогда какой тип использовать?

    З.Ы. Ещё хотелось бы узнать про SendInput. Читал на сайте у микрософта, нифига не понял.
     
  2. BigSnake

    BigSnake New Member

    Joined:
    20 Apr 2010
    Messages:
    15
    Likes Received:
    1
    Reputations:
    0
    изучай чем от твоего варианта отличается, не помню где взял в инете, но свое дело делала
    PHP:
    procedure SendKeys(sTextString);
    var
      
    Integer;
      
    shift Boolean;
      
    vkscancode Word;
      
    ch Char;
      
    cByte;
    const
      
    vk_keys : Array[0..9of Byte=(VK_HOMEVK_ENDVK_UP,
      
    VK_DOWNVK_LEFTVK_RIGHTVK_PRIORVK_NEXTVK_INSERTVK_DELETE);
      
    vk_shft : Array[0..2of Byte=(VK_SHIFTVK_CONTROLVK_MENU);
      
    flags : Array[FALSE..TRUEof Integer = (KEYEVENTF_KEYUP,0);
      
    VK_RETURN 13// 013 ENTER key
    begin
      shift
    :=FALSE;

      if 
    CompareText(sText'ENTERKEY') = 0 then // sText := '~'; // $0D;
      
    begin
        keybd_event
    (VK_RETURN100);
        
    keybd_event(VK_RETURN1KEYEVENTF_KEYUP0);
        exit;
      
    end;

      for 
    i:=1 to Length(sText) do
      
    begin
        ch
    :=sText[i];
        if (
    ch>=#250)
        
    then begin
          s
    :=Ord(ch)-250;
          
    shift:=NOT Odd(s);
          
    c:=vk_shft[s shr 1];
          
    scancode:=MapVirtualKey(c0);
          
    Keybd_Event(cscancodeflags[shift], 0);
        
    end
        
    else begin
          vk
    :=0;
          if (
    ch>=#240)
          
    then c:=vk_keys[Ord(ch)-240]
          else if (
    ch>=#228)
          
    then c:=Ord(ch)-116
          
    else if (ch<#32)
          
    then c:=Ord(ch)
          else 
    begin
            vk
    :=VkKeyScan(ch);
            
    c:=LoByte(vk);
          
    end;
          
    scancode:=MapVirtualKey(c0);
          if (
    NOT shift AND (Hi(vk)>0))
          
    then Keybd_Event(VK_SHIFT, $2A0);
          
    Keybd_Eventcscancode0);
          
    Keybd_EventcscancodeKEYEVENTF_KEYUP);
          if (
    NOT shift AND (Hi(vk)>0))
          
    then Keybd_Event(VK_SHIFT, $2AKEYEVENTF_KEYUP0);
        
    end;
      
    Application.ProcessMessages;
      
    end;
    end;
     
  3. Tip.the.besT

    Tip.the.besT Member

    Joined:
    24 Jun 2009
    Messages:
    267
    Likes Received:
    10
    Reputations:
    4
    Code:
    
    function knop(var s:string): string;
    begin
    if (s=' ')  then
    knop:='32';
    if (s='-')  then
    knop:='189';
    
    if (s='1')  then
    knop:='49';
    if (s='2')  then
    knop:='50';
    if (s='3')  then
    knop:='51';
    if (s='4')  then
    knop:='52';
    if (s='5')  then
    knop:='53';
    if (s='6')  then
    knop:='54';
    if (s='7')  then
    knop:='55';
    if (s='8')  then
    knop:='56';
    if (s='9')  then
    knop:='57';
    if (s='0')  then
    knop:='48';
    
    if (s='q') or (s='й') then
    knop:='81';
    if (s='w') or (s='ц') then
    knop:='87';
    if (s='e') or (s='у') then
    knop:='69';
    if (s='r') or (s='к') then
    knop:='82';
    if (s='t') or (s='е') then
    knop:='84';
    if (s='y') or (s='н') then
    knop:='89';
    if (s='u') or (s='г') then
    knop:='85';
    if (s='i') or (s='ш') then
    knop:='73';
    if (s='o') or (s='щ') then
    knop:='79';
    if (s='p') or (s='з') then
    knop:='80';
    if (s='[') or (s='х') then
    knop:='219';
    if (s=']') or (s='ъ') then
    knop:='221';
    
    if (s='a') or (s='ф') then
    knop:='65';
    if (s='s') or (s='ы') then
    knop:='83';
    if (s='d') or (s='в') then
    knop:='68';
    if (s='f') or (s='а') then
    knop:='70';
    if (s='g') or (s='п') then
    knop:='71';
    if (s='h') or (s='р') then
    knop:='72';
    if (s='j') or (s='о') then
    knop:='74';
    if (s='k') or (s='л') then
    knop:='75';
    if (s='l') or (s='д') then
    knop:='76';
    if (s=';') or (s='ж') then
    knop:='186';
    if (s='э')  then
    knop:='222';
    
    if (s='z') or (s='я') then
    knop:='90';
    if (s='x') or (s='ч') then
    knop:='88';
    if (s='c') or (s='с') then
    knop:='67';
    if (s='v') or (s='м') then
    knop:='86';
    if (s='b') or (s='и') then
    knop:='66';
    if (s='n') or (s='т') then
    knop:='78';
    if (s='m') or (s='ь') then
    knop:='77';
    if (s=',') or (s='б') then
    knop:='188';
    if (s='.') or (s='ю') then
    knop:='190';
    if (s='/')  then
    knop:='191';
    end;
    
    Вот такую процедурку накатал, но многое, нужно дорабатывать. Не стал с массивом заворачиваться. Пользуйтесь.
     
  4. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    Ужс, открой для себя switch\case
     
  5. Tip.the.besT

    Tip.the.besT Member

    Joined:
    24 Jun 2009
    Messages:
    267
    Likes Received:
    10
    Reputations:
    4
    Разница только в оформлении. На программе то не скажется.