Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   PostMessage - C# (https://forum.antichat.xyz/showthread.php?t=136649)

QJHoly 22.08.2009 15:12

PostMessage - C#
 
Мне нужно в окне напечатать определенный текст те мне нужен метод в который посылаешь строчку и она печатается. В моем методе реализованная работа с буфером обмена, но мне нужно чтоб именно кнопка за кнопкой нажималась. Помогите написать метод в котором не используется буфер обмена. Нужно с помощь функции PostMessage так как она работает даже без фокуса на окне что и нужно. Вот кстати метод который работает через буфер обмена.
Код:

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;
      }


W!z@rD 22.08.2009 16:28

ну это ты загнул =\

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

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

с нажатием:
Если код твой:
System.Windows.Forms.SendKeys
Если не твой:
keybd_event

QJHoly 22.08.2009 16:45

Цитата:

Сообщение от W!z@rD
ну это ты загнул =\

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

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

с нажатием:
Если код твой:
System.Windows.Forms.SendKeys
Если не твой:
keybd_event

Нужно именно PostMessage так окно одной игры + там есть система защиты и нужно эмулировать нажатие клавишь. Только как сделать чтобы он строчку текста печатал по одному символу можно конечно прописать каждую кнопку но это будет громоздко так как нужно на нескольких языках.

W!z@rD 22.08.2009 16:55

нда...
на почитай:
http://msdn.microsoft.com/ru-ru/library/ms646304(en-us,VS.85).aspx

Функция keybd_event

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

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

QJHoly 22.08.2009 17:08

А через PostMessage вообще не как ?
Код:

PostMessage(mem.WindowHandle, 0x100, 0x46, (int)IntPtr.Zero);
PostMessage(mem.WindowHandle, 0x100, 0x46, (int)IntPtr.Zero);

Просто тут Я эмулирую нажатие клавиши F (0x46) и хотелось бы понять как сделать чтобы через цикл подставлялись клавиши которые нужно нажимать. Только я не понимаю как сделать чтобы из string типа каждый символ определялся.

W!z@rD 22.08.2009 17:57

Console.WriteLine(Keys.Z);
Console.WriteLine((int) char.Parse("z"));

оно?!

QJHoly 22.08.2009 18:07

Вот так печатается символ z на русском раскладе я.
Код:

PostMessage(mem.WindowHandle, 0x100, (int)Keys.Z, 0x101);
Но как тогда определить какой русский символ какой английский потому что строчка может содержать как русские символы так и английские + знаки типа ; / * ()
Если пробовать
Код:

PostMessage(mem.WindowHandle, 0x100,(int)char.Parse("z") 0x101);
не чего ни печатается.

_==wolf==_ 22.08.2009 20:09

SendKeys.Send("ololo{ENTER}");
SendKeys.SendWait("ololo{ENTER}");
второе ждет пока процесс обработает нажатия, первое нет. соотв. первое быстрее. но оно печатает не по хендлу а в том поле куда установлен курсор. тоесть делаем задержку на 3 секунды перед печатью чтобы успеть поставить курсор куда надо.

QJHoly 22.08.2009 20:18

Цитата:

Сообщение от _==wolf==_
SendKeys.Send("ololo{ENTER}");
SendKeys.SendWait("ololo{ENTER}");
второе ждет пока процесс обработает нажатия, первое нет. соотв. первое быстрее. но оно печатает не по хендлу а в том поле куда установлен курсор. тоесть делаем задержку на 3 секунды перед печатью чтобы успеть поставить курсор куда надо.

Читай внимательно топик перед тем как написать. Мне нужно печатать без фокуса на окне.

QJHoly 23.08.2009 21:25

Код:

[DllImport("user32.dll")]
      static extern short VkKeyScan(char ch);

      public static void Edit()
      {
          PostMessage(mem.WindowHandle, 0x100, VkKeyScan('F'), 0x101);

      }

Вот так можно определять символ только вот еще одна проблема как определить с большой буквы печатать или с маленькой + как определить русский к примеру алфавит так как если расклад клавиатуры ру а печатаешь англ символ он печатает ру символ который находится на той же клавише что и англ.


Время: 07:59