Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как записать в текстбокс другого приложения... 
:(
    Опции темы
HiVeR
Дата 8.7.2008, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



как из своей проги записать текст в поле для ввода в другом приложений?
умею пользоваться spy++, то есть ввожу вручную в тот текстбокс букву и затем в spy++ в Messages нахожу произошедшее и там увидел три строчки(ненужное не стал переписывать):
...WM_KEYDOWN nVirtKey: 'F' cRepeat:1...
...WM_CHAR ch CharCode:'224' (224) cRepeat:1...
...WM_KEYUP nVirtKey: 'F' cRepeat:1...
и что делать дальше, подскажите пожалуйстаsmile
нужно, чтобы, допустим, при нажатий на кнопку на моём приложении, текст из моего текстбокса перешел в текстбокс другого приложения, как это осуществляется?, думаю через функцию Api SendMessage или PostMessge, но как их использовать в данном случае?
PM MAIL   Вверх
nikitao
Дата 8.7.2008, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 4
Всего: 26





--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
HiVeR
Дата 8.7.2008, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



Цитата(nikitao @ 8.7.2008,  21:09)
http://forum.vingrad.ru/forum/topic-98014/...ry747241/0.html

я читал ту тему, там нету ответа на мой вопрос..., там говорицо о нажатии кнопки с помощью мышки и пользовании spy++ в целом, а я о другом, я просто не знаю как отправить в текстбокс букву или целую строчку...
PM MAIL   Вверх
nikitao
Дата 8.7.2008, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 4
Всего: 26



Вообще я тут не мастер , но мне кажется что не получится отправить сразу целую строчку. Поэтому надо по символам отправлять , а как символ отправить посмотри через Spy++. Еще можно через буфер попоробовать : отправляешь строку в буфер  , потом фокусируешь и вставляешь. Но повторюсь  - я тут не мастер.


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
_hunter
Дата 9.7.2008, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 2
Всего: 98



В той теме говорится об использовании функции SendMessage()...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
HiVeR
Дата 9.7.2008, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



Цитата
В той теме говорится об использовании функции SendMessage()...

та программа находит окно виндовского калькулятора и нажимает на кнопку "1" 
вот тот код:
Код

using System;
using System.Runtime.InteropServices;

class TestProgram
{
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string className, string windowName);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);

    const int WM_LBUTTONDOWN = 0x0201;
    const int WM_LBUTTONUP = 0x0202;

    static void Main()
    {
        // находим окно калькулятора, зная window class ("SciCalc")
        IntPtr calcWnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "SciCalc", null);

        // находим кнопку по имени окна ("1") и имени класса ("Button")
        IntPtr button1 = FindWindowEx(calcWnd, IntPtr.Zero, "Button", "1");

        // если нашли
        if(button1 != IntPtr.Zero)
        {
            // посылаем нажатие кнопки мыши, последний параметр
            // содержит координаты мыши (скопировано из Spy++)
            SendMessage(button1, WM_LBUTTONDOWN, 1, 0x150018);
            SendMessage(button1, WM_LBUTTONUP, 0, 0x150018);
        }
    }
}

а если нужно чтото вписать в строчку, где вводятся цифры, то как нужно поступить тогда?
вот измененный мною код:
Код

using System;
using System.Runtime.InteropServices;

class TestProgram
{
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string className, string windowName);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
    const int WM_LBUTTONDOWN = 0x0201;
    const int WM_LBUTTONUP = 0x0202;
    static void Main()
    {
        // находим окно калькулятора, зная window class ("SciCalc")
        IntPtr calcWnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "SciCalc", null);
        // находим поле по имени класса ("Edit")
        IntPtr textcalc = FindWindowEx(calcWnd, IntPtr.Zero, "Edit", null);
        // если нашли
        if(textcalc != IntPtr.Zero)
        {
            SendMessage(textcalc, ???, ???, ???);
        }
        Console.WriteLine(calcWnd+"  "+textcalc); //проверка, найдены ли были хендлы окна и текстбокса
    }
    
}

а теперь вопросы:
1. что писать в местах ???, чтобы отправить в текстбокс букву или цифру?
2. что означает IntPtr.Zero?
3. для чего вот эти строчки:
const int WM_LBUTTONDOWN = 0x0201;
const int WM_LBUTTONUP = 0x0202;
и всегда ли их нужно писать?

Это сообщение отредактировал(а) HiVeR - 9.7.2008, 13:26
PM MAIL   Вверх
_hunter
Дата 9.7.2008, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 2
Всего: 98



ты бы матчасть подучил бы...
в местах ??? писать то, что тебе spy показал. если что -- не стесняйся и смотри в справку.
IntPtr.Zero, как абсолютно не видно из названия, обозначает 0.
эти вот строчки нужны для объявления значения констант WM_LBUTTONDOWN и WM_LBUTTONUP 
их нужно писать не всегда. пиши их тогда, когда они нужны...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
HiVeR
Дата 9.7.2008, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



Цитата(_hunter @ 9.7.2008,  15:24)
ты бы матчасть подучил бы...
в местах ??? писать то, что тебе spy показал. если что -- не стесняйся и смотри в справку.
IntPtr.Zero, как абсолютно не видно из названия, обозначает 0.
эти вот строчки нужны для объявления значения констант WM_LBUTTONDOWN и WM_LBUTTONUP 
их нужно писать не всегда. пиши их тогда, когда они нужны...

что такое матчасть?
spy после нажатия F показал мне вот это:
...WM_KEYDOWN nVirtKey: 'F' cRepeat:1...
...WM_CHAR ch CharCode:'224' (224) cRepeat:1...
...WM_KEYUP nVirtKey: 'F' cRepeat:1...
а что с этим делать я беспонятия, с нажатием кнопки всё значительно проще и про какую справку ты имеешь ввиду?
те две строчки понятное дело, что нужны если используются, но что писать вместо них, если надо нажать клавишу на клавиатуре? читал, что поступающие сообщения от Windows имеют префикс WM_, и для разных таковых сообщений, разные значения. для WM_KEYDOWN = 0x0100, а для WM_KEYUP = 0x0101 и для WM_CHAR = 0x0102, по сути это и нужно вписать, так?

Это сообщение отредактировал(а) HiVeR - 9.7.2008, 22:08
PM MAIL   Вверх
_hunter
Дата 10.7.2008, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 2
Всего: 98



Цитата(HiVeR @  9.7.2008,  22:07 Найти цитируемый пост)
что такое матчасть?

Ответ на этот вопрос дает первая же ссылка гугла (запрос "учи матчасть"). Если не осилиш гугл -- вот: http://lurkmore.ru/Учи_матчасть прямая ссылка.

Цитата(HiVeR @  9.7.2008,  22:07 Найти цитируемый пост)
а что с этим делать я беспонятия

Вот поэтому и следует учить матчасть... Если кратко -- полученные сообщения и их параметны нужно вписать на соответствующие места в месте вызова SendMessage().

Цитата(HiVeR @  9.7.2008,  22:07 Найти цитируемый пост)
с нажатием кнопки всё значительно проще 

естественно -- там все уже написанно...

Справка (а точнее СПРАВКА) тут одна -- MSDN...
Цитата(HiVeR @  9.7.2008,  22:07 Найти цитируемый пост)
но что писать вместо них, если надо нажать клавишу на клавиатуре?

писать, как ни странно, сообщения нажатия клавиши на клавиатуре (их показал spy)



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
HiVeR
Дата 10.7.2008, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



Цитата
Если кратко -- полученные сообщения и их параметны нужно вписать на соответствующие места в месте вызова SendMessage().

Цитата
писать, как ни странно, сообщения нажатия клавиши на клавиатуре (их показал spy)

можешь пожалуста показать пример? например как отправить F в виндовский блокнот, используя SendMessage
я по разному пробовал, не получилось. информации по этому поводу не нашёл...
PM MAIL   Вверх
_hunter
Дата 10.7.2008, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 2
Всего: 98



Цитата(HiVeR @  10.7.2008,  11:19 Найти цитируемый пост)
я по разному пробовал, не получилось.

код не помешало бы показать -- телепатию я не особо прокачивал...

Цитата(HiVeR @  10.7.2008,  11:19 Найти цитируемый пост)
информации по этому поводу не нашёл

не смешите мои тапочки: инфы (и примеров) всевозможных отправлялок текста -- море...

вот:
http://www.delphisources.ru/pages/faq/base...er_windows.html
неплохая дока (для начала) по окнам
да и по Send/PostMessage не помешало бы почитать...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
HiVeR
Дата 10.7.2008, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



Цитата(_hunter @ 10.7.2008,  11:48)
Цитата(HiVeR @  10.7.2008,  11:19 Найти цитируемый пост)
я по разному пробовал, не получилось.

код не помешало бы показать -- телепатию я не особо прокачивал...

Цитата(HiVeR @  10.7.2008,  11:19 Найти цитируемый пост)
информации по этому поводу не нашёл

не смешите мои тапочки: инфы (и примеров) всевозможных отправлялок текста -- море...

вот:
http://www.delphisources.ru/pages/faq/base...er_windows.html
неплохая дока (для начала) по окнам
да и по Send/PostMessage не помешало бы почитать...

_hunter, большое спасибо!!!, ты настоящий эксперт))))), толком ни на один мой вопрос не ответил, оно и правильно) всё слишком просто, исходя из примера с мышкой)), но я сразу не догнал...
PM MAIL   Вверх
HiVeR
Дата 12.7.2008, 16:59 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



просветите пожалуйста, как используется буфер в си шарпе?
в интернете не нашёл решения для си шарпа и в мсдн тоже.
по сути я просто не знаю синтаксиса при использовании буфера...

насколько знаю для записи чеголибо в буфер нужно использовать такую последовательность действий: 
Открыть буфер обмена функцией OpenClipboard 
Очистить содержимое буфера обмена функцией EmptyClipboard 
Заказать функцией GlobalAlloc глобальный блок памяти, имеющий размер, достаточный для размещения записываемых в буфер обмена данных 
Заблокировать полученный блок памяти функцией GlobalLock 
Записать в заблокированный блок памяти данные 
Разблокировать блок памяти функцией GlobalUnlock 
Поместить данные в буфер обмена функцией SetClipboardData 
Закрыть буфер обмена функцией CloseClipboard


нашёл код на с++:
Код

//запись текста в буфер обмена
if(OpenClipboard())//открываем буфер обмена
{
   HGLOBAL hgBuffer;
   char* chBuffer;
   EmptyClipboard(); //очищаем буфер
   hgBuffer= GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1);//выделяем память
   chBuffer= (char*)GlobalLock(hgBuffer); //блокируем память
   strcpy(chBuffer, LPCSTR(source));
   GlobalUnlock(hgBuffer);//разблокируем память
   SetClipboardData(CF_TEXT, hgBuffer);//помещаем текст в буфер обмена
   CloseClipboard(); //закрываем буфер обмена
}

может кто-нить перевести тот код в с#, или дать простенький примерчик с использованием буфера, буду очень благодарен


сорр, что не там запостил, просто поторопился, а удалить его уже не смог...((((((

Это сообщение отредактировал(а) HiVeR - 12.7.2008, 17:04
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0819 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.