Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# .NET

Войти
Регистрация
Восстановить пароль
 
 
V0fka
3 / 3 / 0
Регистрация: 24.05.2010
Сообщений: 151
#1

Как сделать "подсказку" в стороннем приложении - C#

16.06.2015, 10:28. Просмотров 978. Ответов 21
Метки нет (Все метки)

Привет!

Нужно сделать, чтобы при нажатии какого-то сочетания клавиш, возле курсора показывался какой-то список с выбором чего-то (чего-то в моем случае - это будут текстовые строки). Выбираем (стрелками на клавиатуре), жмем энтер и туда где курсор - вставляется определенный текст.

Возможно, не совсем понятно, попробую на примере. В Visual Studio есть IntelliSense. Я хочу сделать визуально что-то похожее, но просто для вставки текста в активное поле ввода любого приложения.

Куда смотреть - не знаю. Даже не знаю, как к гуглу с вопросом обратиться. А именно, я имею представление как сделать перехват клавиатуры. Как вставить текст в другое приложение - я тоже какую-то информацию вроде бы нашел (пока правда не проверял). Но как вывести "подсказку" у курсора - не знаю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2015, 10:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сделать "подсказку" в стороннем приложении (C#):

Как нажать на пункт в списке в стороннем приложении? - C#
Запускаю стороннее приложение. Через WinApi получаю доступ к нему. В нем есть список с одинаковыми значениями. Нужно на каждый этот пункт...

У меня есть строка "C:\Dan\Bas\image\win7\desktop\1.jpg" как мне сделать так чтобы выводилось начиная от "desktop\1.jpg"? - C#
У меня есть строка "C:\Dan\Bas\image\win7\desktop\1.jpg" как мне сделать так чтобы выводилось начиная от "desktop\1.jpg"? У меня...

Игра "Трубопровод". Как сделать проверку трубопровода на связность - C#
Всем привет. Пишу игру "Трубопровод (Ветка)". Игра будет консольная. Имеется два вопроса. Первый вопрос: Нужно чтобы программа...

Игра "Трубопровод": как сделать разъединение труб - C#
Добрый день. Пишу игру Трубопровод. http://home.earthlink.net/~tdglenn/unicorn/pipegame.htm. Не получается сделать разъединение труб. Т.е....

Как сделать "текст-приглашение" для ввода данных в TextEdit - C#
Добрый день. Подскажите пожалуйста как делается начальный "текст-приглашение" для ввода данных. У меня есть TextEdit. Нужно чтобы...

Текстовый файл. строка с 3 "объектами" разделенные разделителем "," как обратиться к каждому из объектов? - C#
Всем добрый день. Имеется текстовый файл. содержимое: более 31.000 строк. каждая строка имеет примерно вот такой вид: ...

21
EvilFromHell
943 / 842 / 265
Регистрация: 26.04.2012
Сообщений: 2,648
21.06.2015, 15:28 #16
Моя-то функция у меня работает исправно, но не в гугл хроме. С трудом понимаю, что там можно сделать не так.
Откройте данное приложение, потом откройте блокнот, сделайте его окошко маленьким и попробуйте туда что-то написать. Форма будет перемещаться вслед за кареткой.
1
Вложения
Тип файла: rar WindowsFormsApplication83.rar (47.8 Кб, 1 просмотров)
V0fka
3 / 3 / 0
Регистрация: 24.05.2010
Сообщений: 151
23.06.2015, 17:11  [ТС] #17
Спасибо!
Уже лучше. Где-то я наговнокодил со вставкой текста и, видимо, из-за этого определение каретки как-то криво вставил. Только что проверил ваш пример - работает как часы. Поправил немножко свой код - и какие-то координаты начались показываться! Но у меня показываются другие координаты, чем у вас. У меня WPF приложение, сделал так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private void Application_Startup(object sender, StartupEventArgs e)
        {
            SetTimer();
        }
 
        private void SetTimer()
        {
            DispatcherTimer t = new DispatcherTimer();
            t.Interval = new TimeSpan(1000);
            t.Tick += t_Tick;
            t.Start();
        }
 
        void t_Tick(object sender, EventArgs e)
        {
            Point p = Care.GetCaretPosition();
            Debug.WriteLine("X=" + p.X + ", Y=" + p.Y);
        }
В ваш пример внес небольшое изменение, чтобы просто отслеживать координаты. Добавил 2 TextBox-а и пишу в них координаты:

C#
1
2
3
4
5
6
7
        private void timer1_Tick(object sender, EventArgs e)
        {
            Point result = GetCaretPosition();
 
            textBox_X.Text = result.X.ToString();
            textBox_Y.Text = result.Y.ToString();
        }
И координаты получаются разные. Например, ваша программа отображает 401 и 451, а моя 61,0137329101587 и 1.
Если я помещу курсор в поле ввода в вашей программе и начинаю двигать окно, то вижу, что координаты там меняются и очень похоже на соответствии траектории движения окна. Моя же программа при этом всегда выводит Х=NaN, Y=1. Т.е. ваша программа работает корректно, а моя нет.

Если вам не сложно, не могли бы взглянуть что я сделал?
0
Вложения
Тип файла: zip TestCaret.zip (53.9 Кб, 1 просмотров)
EvilFromHell
943 / 842 / 265
Регистрация: 26.04.2012
Сообщений: 2,648
23.06.2015, 21:15 #18
Не сразу врубился, но нашел таки в чем дело: в разных структурах Point. У вас System.Windows.Point а у меня System.Drawing.Point. И API функция ClientToScreen некорректно работает с первой. Так что укажите явно пространство имен у всех Point и заработает. Да, и таймер у вас считает промежуток времени не в миллисекундах, а в сотнях наносекунд, что намного меньше(10000=1миллисекунда) и в результате он вызывается черезчур часто.
1
V0fka
3 / 3 / 0
Регистрация: 24.05.2010
Сообщений: 151
24.06.2015, 09:27  [ТС] #19
EvilFromHell, спасибо вам большое за помощь!
Теперь, правда, появились новые вопросы, но это уже другая история .
0
V0fka
3 / 3 / 0
Регистрация: 24.05.2010
Сообщений: 151
25.06.2015, 10:50  [ТС] #20
Можно я ещё кое что спрошу?

В общем, изначально я собирал проект под net framework 4.5
Решил его собрать под 4-ю версию фреймворка. После этого перестает работать функция GetCaretPosition, а именно GetGUIThreadInfo(process, ref GTI) стал возвращать false.
Меняю версию .net framework обратно на 4.5, пересобираю проект, но программа по прежнему не работает, по той же причину.

В общем, мне не составило особо труда создать новый проект и перекопировать туда код. Но, во-первых, очень интересно почему так происходит. А во-вторых, мне надо это приложение запустить под ХР, а в ХР 4.5 фреймворк не поддерживается.

Приложу на всякий случай пример, который изначально был под 4.5, потом под 4, а сейчас снова под 4.5, но уже не работает.
0
Вложения
Тип файла: zip TestCaret.zip (63.9 Кб, 3 просмотров)
EvilFromHell
943 / 842 / 265
Регистрация: 26.04.2012
Сообщений: 2,648
27.06.2015, 12:55 #21
C#
1
2
3
4
5
6
7
8
9
10
11
12
        public struct GUITHREADINFO
        {
            public int cbSize;
            public int flags;
            public IntPtr hwndActive;
            public IntPtr hwndFocus;
            public IntPtr hwndCapture;
            public IntPtr hwndMenuOwner;
            public IntPtr hwndMoveSize;
            public IntPtr hwndCaret;
            public System.Drawing.Rectangle rcCaret;
        }
Вот так структуру попробуйте объявить.
1
V0fka
3 / 3 / 0
Регистрация: 24.05.2010
Сообщений: 151
30.06.2015, 09:38  [ТС] #22
EvilFromHell, вы волшебник! Спасибо большое!
0
30.06.2015, 09:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2015, 09:38
Привет! Вот еще темы с ответами:

Ошибка после конвертации метода на С++ к С#: "Неявное преобразование типа "int" в "bool" невозможно" - C#
Ошибка после преобразования метода на С++ к С#: "Неявное преобразование типа "int" в "bool" невозможно" Метод взят отсюда...

Ошибка CS0019: Оператор "*" не может применяться к операндам типа "decimal" и "float" - C#
Здравствуйте! Писал приложение и наткнулся на интересную ошибку (честно говоря, я не совсем понимаю причину такого ограничения. В коде//...

Кликнуть на кнопку в стороннем приложении - C#
int hwnd=0; IntPtr hwndChild=IntPtr.Zero; //Get a handle for the Calculator Application main window ...

Имитация нажатия ПКМ в стороннем приложении - C#
Привет, понимаю что тема обсуждалась миллион раз, но я уже перерыл все что нашел и никак не дойдет что не так... Смотрите, смастерил хук на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.