PDA

Просмотр полной версии : PostMessage - C#


QJHoly
22.08.2009, 15:12
Мне нужно в окне напечатать определенный текст те мне нужен метод в который посылаешь строчку и она печатается. В моем методе реализованная работа с буфером обмена, но мне нужно чтоб именно кнопка за кнопкой нажималась. Помогите написать метод в котором не используется буфер обмена. Нужно с помощь функции 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
ну это ты загнул =\

это без нажатия:
все что тебе нужно это:
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
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);

}

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