Мне нужно в окне напечатать определенный текст те мне нужен метод в который посылаешь строчку и она печатается. В моем методе реализованная работа с буфером обмена, но мне нужно чтоб именно кнопка за кнопкой нажималась. Помогите написать метод в котором не используется буфер обмена. Нужно с помощь функции 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; }
ну это ты загнул =\ это без нажатия: все что тебе нужно это: 1. FindWindow 2. FindWindowEx 3. SetWindowText это WinAPI функции. Описание в msdn, а описание импорта на http://pinvoke.net с нажатием: Если код твой: System.Windows.Forms.SendKeys Если не твой: keybd_event
Нужно именно PostMessage так окно одной игры + там есть система защиты и нужно эмулировать нажатие клавишь. Только как сделать чтобы он строчку текста печатал по одному символу можно конечно прописать каждую кнопку но это будет громоздко так как нужно на нескольких языках.
нда... на почитай: http://msdn.microsoft.com/ru-ru/library/ms646304(en-us,VS.85).aspx Функция keybd_event (событие_клавиатуры) Функция keybd_event синтезирует нажатие клавиши. Система может использовать такое синтезируемое нажатие клавиши, чтобы создать сообщение WM_KEYUP или WM_KEYDOWN. Вызывает функцию keybd_event программа обработки прерываний драйвера клавиатуры.
А через PostMessage вообще не как ? Code: PostMessage(mem.WindowHandle, 0x100, 0x46, (int)IntPtr.Zero); PostMessage(mem.WindowHandle, 0x100, 0x46, (int)IntPtr.Zero); Просто тут Я эмулирую нажатие клавиши F (0x46) и хотелось бы понять как сделать чтобы через цикл подставлялись клавиши которые нужно нажимать. Только я не понимаю как сделать чтобы из string типа каждый символ определялся.
Вот так печатается символ z на русском раскладе я. Code: PostMessage(mem.WindowHandle, 0x100, (int)Keys.Z, 0x101); Но как тогда определить какой русский символ какой английский потому что строчка может содержать как русские символы так и английские + знаки типа ; / * () Если пробовать Code: PostMessage(mem.WindowHandle, 0x100,(int)char.Parse("z") 0x101); не чего ни печатается.
SendKeys.Send("ololo{ENTER}"); SendKeys.SendWait("ololo{ENTER}"); второе ждет пока процесс обработает нажатия, первое нет. соотв. первое быстрее. но оно печатает не по хендлу а в том поле куда установлен курсор. тоесть делаем задержку на 3 секунды перед печатью чтобы успеть поставить курсор куда надо.
Code: [DllImport("user32.dll")] static extern short VkKeyScan(char ch); public static void Edit() { PostMessage(mem.WindowHandle, 0x100, VkKeyScan('F'), 0x101); } Вот так можно определять символ только вот еще одна проблема как определить с большой буквы печатать или с маленькой + как определить русский к примеру алфавит так как если расклад клавиатуры ру а печатаешь англ символ он печатает ру символ который находится на той же клавише что и англ.