PostMessage - C#

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by QJHoly, 22 Aug 2009.

  1. QJHoly

    QJHoly New Member

    Joined:
    28 Nov 2007
    Messages:
    13
    Likes Received:
    1
    Reputations:
    0
    Мне нужно в окне напечатать определенный текст те мне нужен метод в который посылаешь строчку и она печатается. В моем методе реализованная работа с буфером обмена, но мне нужно чтоб именно кнопка за кнопкой нажималась. Помогите написать метод в котором не используется буфер обмена. Нужно с помощь функции PostMessage так как она работает даже без фокуса на окне что и нужно. Вот кстати метод который работает через буфер обмена.
    Code:
    public static void SendTextToNotepad(string text)
           {
               try
               {
                   string data = Conversions.ToString(Clipboard.GetData(DataFormats.Text));
                   Clipboard.SetDataObject(text, true);
                   if (Operators.ConditionalCompareObjectEqual(Clipboard.GetData(DataFormats.Text), text, false))
                   {
                       PostMessage(mem.WindowHandle, 0x100, 13, (int)IntPtr.Zero);
                       PostMessage(mem.WindowHandle, 0x101, 13, (int)IntPtr.Zero);
                       Thread.Sleep(50);
                       PostMessage(mem.WindowHandle, 0x100, 0xa2, (int)IntPtr.Zero);
                       PostMessage(mem.WindowHandle, 0x100, 0x56, (int)IntPtr.Zero);
                       Thread.Sleep(200);
                       PostMessage(mem.WindowHandle, 0x101, 0xa2, (int)IntPtr.Zero);
                       Thread.Sleep(50);
                       PostMessage(mem.WindowHandle, 0x100, 8, (int)IntPtr.Zero);
                       Thread.Sleep(50);
                       PostMessage(mem.WindowHandle, 0x100, 13, (int)IntPtr.Zero);
                       PostMessage(mem.WindowHandle, 0x101, 13, (int)IntPtr.Zero);
                       PostMessage(mem.WindowHandle, 0x101, 0x56, (int)IntPtr.Zero);
                       PostMessage(mem.WindowHandle, 0x101, 8, (int)IntPtr.Zero);
                       Clipboard.SetDataObject(data, true);
                   }
               }
               catch (Exception exception1)
               {
                   ProjectData.SetProjectError(exception1);
                   Exception exception = exception1;
                   ProjectData.ClearProjectError();
               }
             // return 0;
           }  
    
     
  2. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    ну это ты загнул =\

    это без нажатия:
    все что тебе нужно это:
    1. FindWindow
    2. FindWindowEx
    3. SetWindowText

    это WinAPI функции.
    Описание в msdn, а описание импорта на http://pinvoke.net

    с нажатием:
    Если код твой:
    System.Windows.Forms.SendKeys
    Если не твой:
    keybd_event
     
    #2 W!z@rD, 22 Aug 2009
    Last edited: 22 Aug 2009
  3. QJHoly

    QJHoly New Member

    Joined:
    28 Nov 2007
    Messages:
    13
    Likes Received:
    1
    Reputations:
    0
    Нужно именно PostMessage так окно одной игры + там есть система защиты и нужно эмулировать нажатие клавишь. Только как сделать чтобы он строчку текста печатал по одному символу можно конечно прописать каждую кнопку но это будет громоздко так как нужно на нескольких языках.
     
    #3 QJHoly, 22 Aug 2009
    Last edited: 22 Aug 2009
  4. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    нда...
    на почитай:
    http://msdn.microsoft.com/ru-ru/library/ms646304(en-us,VS.85).aspx

    Функция keybd_event

    (событие_клавиатуры)

    Функция keybd_event синтезирует нажатие клавиши. Система может использовать такое синтезируемое нажатие клавиши, чтобы создать сообщение WM_KEYUP или WM_KEYDOWN. Вызывает функцию keybd_event программа обработки прерываний драйвера клавиатуры.
     
  5. QJHoly

    QJHoly New Member

    Joined:
    28 Nov 2007
    Messages:
    13
    Likes Received:
    1
    Reputations:
    0
    А через PostMessage вообще не как ?
    Code:
    PostMessage(mem.WindowHandle, 0x100, 0x46, (int)IntPtr.Zero);
    PostMessage(mem.WindowHandle, 0x100, 0x46, (int)IntPtr.Zero);
    
    Просто тут Я эмулирую нажатие клавиши F (0x46) и хотелось бы понять как сделать чтобы через цикл подставлялись клавиши которые нужно нажимать. Только я не понимаю как сделать чтобы из string типа каждый символ определялся.
     
  6. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    Console.WriteLine(Keys.Z);
    Console.WriteLine((int) char.Parse("z"));

    оно?!
     
    #6 W!z@rD, 22 Aug 2009
    Last edited: 22 Aug 2009
  7. QJHoly

    QJHoly New Member

    Joined:
    28 Nov 2007
    Messages:
    13
    Likes Received:
    1
    Reputations:
    0
    Вот так печатается символ z на русском раскладе я.
    Code:
    PostMessage(mem.WindowHandle, 0x100, (int)Keys.Z, 0x101);
    
    Но как тогда определить какой русский символ какой английский потому что строчка может содержать как русские символы так и английские + знаки типа ; / * ()
    Если пробовать
    Code:
    PostMessage(mem.WindowHandle, 0x100,(int)char.Parse("z") 0x101); 
    
    не чего ни печатается.
     
    #7 QJHoly, 22 Aug 2009
    Last edited: 22 Aug 2009
  8. _==wolf==_

    _==wolf==_ Elder - Старейшина

    Joined:
    29 May 2008
    Messages:
    127
    Likes Received:
    38
    Reputations:
    6
    SendKeys.Send("ololo{ENTER}");
    SendKeys.SendWait("ololo{ENTER}");
    второе ждет пока процесс обработает нажатия, первое нет. соотв. первое быстрее. но оно печатает не по хендлу а в том поле куда установлен курсор. тоесть делаем задержку на 3 секунды перед печатью чтобы успеть поставить курсор куда надо.
     
  9. QJHoly

    QJHoly New Member

    Joined:
    28 Nov 2007
    Messages:
    13
    Likes Received:
    1
    Reputations:
    0
    Читай внимательно топик перед тем как написать. Мне нужно печатать без фокуса на окне.
     
  10. QJHoly

    QJHoly New Member

    Joined:
    28 Nov 2007
    Messages:
    13
    Likes Received:
    1
    Reputations:
    0
    Code:
    [DllImport("user32.dll")]
           static extern short VkKeyScan(char ch);
    
           public static void Edit()
           {
               PostMessage(mem.WindowHandle, 0x100, VkKeyScan('F'), 0x101);
    
           }
    
    Вот так можно определять символ только вот еще одна проблема как определить с большой буквы печатать или с маленькой + как определить русский к примеру алфавит так как если расклад клавиатуры ру а печатаешь англ символ он печатает ру символ который находится на той же клавише что и англ.