Программа для вставки текста

Обсуждения по программированию для ОС Windows безотносительно используемого языка программирования. Windows NT, Win32, Windows API, ядро и драйверы.
Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Программа для вставки текста

Сообщение Qwertiy » 11.06.2012 (Пн) 21:25

На VB.NET пишу программу, которая должна по нажатию горячей клавиши показать меню, в котором можно выбрать нужный вариант, а затем послать соответствующие нажатия клавиш.

Сделал форму, которая сейчас всегда невидима (в дальнейшем планирую использовать её для настройки пунктов меню), у неё есть ContextMenuStrip.
При запуске форма регистрирует сочетание клавиш Win+V. Когда эти клавиши нажимаются, определяется активное окно, выполняется привоединение к его потоку, для активного контрола запрашиваются границы выделения и положение текстового курсора на экране. После чего показывается и делается активным контекстное меню. При выборе в нём одного из пунктов, активируется то окно, которое до этого было активным, для контрола устанавливаются границы выделения, затем посылаются нажатия клавиш. В конце делается отсоединение от потока.
Всё это сделано и работает. Правда, сейчас подумал, что если ни один из пунктов меню не выбирается, отсоединение не происходит. Что ж, исправлю :)

Теперь, в чём проблема:
1. Если при открытом меню щёлкнуть мышью по какому-нибудь другому окну, оно не исчезнет.
2. Не работает с переименованием в Проводнике и подобных ему диалогами. Т. е. если вызвать меню во время переименования файла, то переименование прекращается (когда именно не знаю, но когда меню видимо и активно, текстовой области уже нет).
3. Не для всех программ определяется положение курсора. Есть ещё способы кроме GetCaretPos? Необязательно стандартные или работающие для всех окон. Просто какие-нибудь, можно с указанием класса, к которому они применимы.
4. Если стоял не английский язык, то латинские символы вводятся как русские. Но тут рядом была тема про языки, ещё её посмотрю - там был ответ, кажется. Просто не занимался ещё этим вопросом.

Приходил в голову вариант показывать меню, но не делать его активным, а ставить глобальных хук на нажатия клавиш и обрабатывать их. При закрытии меню этот хук снимать. Но что-то мне не нравится этот вариант... Да и не факт, что от этого будут какие-то плюсы.

PS: Moved from Наши проекты (11.06.2012 02:16 GMT+4)

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.06.2012 (Вт) 8:20

Неужели никто ничего подсказать не может?
Хакер, ну не может быть, чтобы ты не мог что-нибудь полезное сказать ;)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Программа для вставки текста

Сообщение Хакер » 12.06.2012 (Вт) 16:33

Я не очень понимаю. Программа на дотнете. Почему топик в этом разделе? Проблемы изложены так, что читаешь, и ничего непонятно.
Изложи понятнее, что ты используешь, в чём идеология работы, как ты достигаешь желаемого, и самое главное.
Какой результат работы ты ожидаешь (и почему ты ожидаешь именно такой), и какой результат работы ты получаешь.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.06.2012 (Вт) 18:03

Хакер писал(а):Почему топик в этом разделе?

Потому что от .NET'а там только форма, контекстное меню и SendKeys. Остальное - WinApi.

Хакер писал(а):Какой результат работы ты ожидаешь

По нажатию Win+V в районе текстового курсора (любой программы) появляется контекстное меню, с помощью которого выбирается текст, посылаемый с помощью SendKeys.

Хакер писал(а):и какой результат работы ты получаешь

Я получаю тот результат, который ожидаю. За исключением тех пунктов, которые привёл.
А именно:
1. Нажимаю Win+V, меню отображается. Щёлкаю мышью в произвольном месте любого окна, вне этого меню. Меню остаётся на экране. (Надо, чтобы исчезало.)
2. В Проводнике при переименовании нажимаю Win+V. В тот момент, когда меню активно, поля переименования уже нет. Соответственно при выборе чего-либо из меню, я не получаю желаемого результата.
3. Не всегда удаётся определить положение курсора с помощью функции GetCaretPos. Есть ли какие-либо другие способы, в том числе применимые только к конкретным видам окон/программам?
4. Если в программе, из которой вызывается меню была русская раскладка, то вместо английских символов набираются русские. Но по этому поводу я ещё собираюсь поизучать эту тему.

Позже покажу код, если он нужен. Сейчас его при мне нету.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Программа для вставки текста

Сообщение Хакер » 14.06.2012 (Чт) 17:48

А зачем вообще всё это надо?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 14.06.2012 (Чт) 21:05

Хакер писал(а):А зачем вообще всё это надо?

Нечто вроде буфера обмена, но только для текста. Часть пунктов перечисляется в настройках заранее, часть вычисляется в момент показа меню. Планируется также возможность модификации списка без перезапуска программы.

Сейчас код причешу (а то у меня там свалка) и выложу.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Программа для вставки текста

Сообщение Хакер » 14.06.2012 (Чт) 21:17

Если это нечто вроде буфера, с чего ради надо использовать SendKeys?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 14.06.2012 (Чт) 21:54

Хакер писал(а):Если это нечто вроде буфера, с чего ради надо использовать SendKeys?

Наиболее универсальный способ, на мой взгляд. Не накладывает никаких требований на окно или контрол, в.т.ч. работает с консолью и текстовыми полями в браузере. Если честно, про другие и не думал. Только работает медленно, хотя если большой объём не пихать, то всё хорошо.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 14.06.2012 (Чт) 23:20

А вот и код :)

Text Typer.7z
Код, VB.NET, нужен .NET 4
(8.31 Кб) Скачиваний: 361

Проблема с тем, что меню не исчезало, исчезла после модификации кода.
Что про остальные пункты?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Программа для вставки текста

Сообщение Хакер » 14.06.2012 (Чт) 23:35

Ну я дотнетный код смотреть не буду в любом случае. Нечем.

Qwertiy писал(а):2. В Проводнике при переименовании нажимаю Win+V. В тот момент, когда меню активно, поля переименования уже нет. Соответственно при выборе чего-либо из меню, я не получаю желаемого результата.

Каким образом показывается меню?

Qwertiy писал(а):3. Не всегда удаётся определить положение курсора с помощью функции GetCaretPos. Есть ли какие-либо другие способы, в том числе применимые только к конкретным видам окон/программам?

Если реализация контрола не использует системные возможности по отображению и управлению кареткой, то вообще никак, разумеется.

Qwertiy писал(а):4. Если в программе, из которой вызывается меню была русская раскладка, то вместо английских символов набираются русские. Но по этому поводу я ещё собираюсь поизучать эту тему.

Если верить документации функции, то так (и никак иначе) и должно быть.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 15.06.2012 (Пт) 7:17

Хакер писал(а):Ну я дотнетный код смотреть не буду в любом случае. Нечем.

Notepad++ :)
Я там даже bat-файл положил, чтобы его можно было скомпилировать без VS2010, нужен только .NET Framework 4.

Хакер писал(а):Каким образом показывается меню?

Код: Выделить всё
  CtxMenu.Show(Pos.X, Pos.Y)
  SetForegroundWindow(CtxMenu.Handle)

Хакер писал(а):Если реализация контрола не использует системные возможности по отображению и управлению кареткой, то вообще никак, разумеется.

Я подумал, что некоторые такие контролы могут реализовывать какие-то собственные средства.

Хакер писал(а):Если верить документации функции, то так (и никак иначе) и должно быть.

Ну да, это логично. Просто надо определить язык, поменять его на время набора текста, а потом вернуть обратно :)
Или можно лучше?

Хакер писал(а):с чего ради надо использовать SendKeys?

А есть ещё что-нибудь подходящее?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 15.06.2012 (Пт) 7:23

Да, ещё вопрос. Объявление функций WinApi. Где надо использовать Integer, а где IntPtr? Я так понимаю, на x64 с этим могут быть проблемы?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 16.06.2012 (Сб) 20:52

Кажется, я на все воросы ответил, дальше-то что?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Программа для вставки текста

Сообщение Хакер » 17.06.2012 (Вс) 3:11

Qwertiy писал(а):Ну да, это логично. Просто надо определить язык, поменять его на время набора текста, а потом вернуть обратно :)
Или можно лучше?

Почему? Если строго верить документации по SendKeys, она работает так, как если бы нужная последовательность была набрана на клавиатуре. Что это означает? На клавиатуре набираются не буквы, а «нажатия клавишь» (keystrokes). keystrokes должны быть преобразованы потом в characters, в соответствии с выбранной сейчас раскладкой. Это значит, что SendKeys должна воспроизводить последовательность заданных keystrokes, а не последовательность заданных Это значит, чтобы набрать «привет, dotnet» должна быть послана последовательность keystrokes вот такая: [G][H][B][D][T][N][,][32][CTRL+SHIFT][D][O][T][N][E][T]. А уже программа должна в соответствии с текущей раскладкой (и состоянием Shift/Caps Lock) сама преобразовать это в последовательность символов. Это, подчёркиваю, если верить документации. Поэтому SendKeys совсем не подходит для задачи набора нужного текста. Он подходить для эмуляции нажатия последовательности клавишь. И чтобы набрать нужный текст, нужно эмулировать не только клавиши, соответствующие символам текста. Но судя по тому, что ты пишешь, SendKeys работает несколько не так, как обещано в документации.

Я бы делал так: слал нужному окну WM_PASTE, предварительно внедрившись в целевой процесс и перехватив оттуда попытку прочитать из буфера обмена настоящий текст, подменив его своим текстом. А если это невозможно, заменил бы текст в буфере обмена на свой текст. Но по правде говоря я бы и так не делал, я бы для эдитбоксов, поддерживающих драг-н-дроп, эмулировал бы дроп нужного текста в нужное место.

Qwertiy писал(а):Да, ещё вопрос. Объявление функций WinApi. Где надо использовать Integer, а где IntPtr? Я так понимаю, на x64 с этим могут быть проблемы?

Это всецело дотнетовские заморочки, откуда нам в разделе по чистому WinAPI это знать?

Да и вообще, зачем использовать дотнет, если 95 % кода — вызовы WinAPI? Сами-то не находите глупость слепового стремления использовать свой любимый язык?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 17.06.2012 (Вс) 10:54

Хакер писал(а):Если строго верить документации по SendKeys

Ты это предупреждение так понимаешь, или что-то ещё?
If your application is intended for international use with a variety of keyboards, the use of Send could yield unpredictable results and should be avoided.


Хакер писал(а):Я бы делал так: слал нужному окну WM_PASTE, предварительно внедрившись в целевой процесс и перехватив оттуда попытку прочитать из буфера обмена настоящий текст, подменив его своим текстом. А если это невозможно, заменил бы текст в буфере обмена на свой текст. Но по правде говоря я бы и так не делал, я бы для эдитбоксов, поддерживающих драг-н-дроп, эмулировал бы дроп нужного текста в нужное место.

1. Как узнать, что именно поддерживает конкретный контрол?
2. Обычные текстовые поля перетаскивание не поддерживают. В моём коде специально запоминается и восстанавливается выделение, чтобы можно было с ними нормально работать.
3. Как попытку перетаскивания поймёт окно браузера?
4. Как определить "нужное место"? И как это будет работать, если уже есть выделенный текст?
5. Я не хочу изменять содержимое буфера. К тому же, если его всё-таки изменить, то очень хочется после вставки вернуть назад то, что там было. Не искал, но не очень представляю, как собрать все форматы.
6. А какую проблему это должно решить? Скорость набора и состояние клавиатуры?

Хакер писал(а):Это всецело дотнетовские заморочки, откуда нам в разделе по чистому WinAPI это знать?

Насколько я понимаю, тут разница в битности параметров в 64-разрядных системах - 32 (Integer) или 64 (IntPtr). Сколько бит в хендле окна, wparam, lparam, сообщении в SendMessage?

Хакер писал(а):Да и вообще, зачем использовать дотнет, если 95 % кода — вызовы WinAPI?

Когда добавлю остальные возможности, будет процентов 50, наверное ;) Да и сейчас не 95 :)

Qwertiy писал(а):Не работает с переименованием в Проводнике и подобных ему диалогами.

Склоняюсь к перехвату нажатий клавиш при отображаемом меню, т. е. не делать меню активным окном. Для этого нужно ставить хук, или есть другие способы?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Программа для вставки текста

Сообщение Хакер » 17.06.2012 (Вс) 11:43

Qwertiy писал(а):Ты это предупреждение так понимаешь, или что-то ещё?

Впервые вижу его. Я так здравую логику понимаю. Написано, что SendKeys works exactly as if you are typing on your keyboard (не дословно). То есть надо так понимать, что SendKeys работает так, как будто она управляет роботизированной рукой-манипулятором, которая тыкает по нужным клавишам клавиатуры. Если так, то конечно происходит то, что происходит. Но в вот в VB6 документация пишет так же, а функция работает не так, как пишет документация.

Qwertiy писал(а):1. Как узнать, что именно поддерживает конкретный контрол?

Узнать по первому требованию — прямо так сразу и не скажу. Узнать вообще можно перехватив RegisterDropTarget.

Qwertiy писал(а):2. Обычные текстовые поля перетаскивание не поддерживают. В моём коде специально запоминается и восстанавливается выделение, чтобы можно было с ними нормально работать.

Но сразу начинают поддерживать, если вызвать вышеупомянутую функцию.

Qwertiy писал(а):3. Как попытку перетаскивания поймёт окно браузера?

Какого? И в чём проблема?

Qwertiy писал(а):4. Я не хочу изменять содержимое буфера. К тому же, если его всё-таки изменить, то очень хочется после вставки вернуть назад то, что там было. Не искал, но не очень представляю, как собрать все форматы.

А зачем все? Ты меняешь CF_TEXT, шлёшь WM_PASTE, меняешь CF_TEXT на то, что там было раньше. WM_PASTE работает только для CF_TEXT.

Qwertiy писал(а):Сколько бит в хендле окна, wparam, lparam, сообщении в SendMessage?

Если я не ошибусь с предположением, то можно пойти на максимум — взять 64 для всех параметров. Что, неужели в дотнете для отправки оконных сообщений надо декларировать WinAPI-функцию? И нет никакой встроенной ООП-ной фигнюльки для выполнения этой задачи? Бюэ.

Qwertiy писал(а):Склоняюсь к перехвату нажатий клавиш при отображаемом меню, т. е. не делать меню активным окном. Для этого нужно ставить хук, или есть другие способы?

Не понял связи между сказанным. Подробнее.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 17.06.2012 (Вс) 13:20

Хакер, ты пропустил изменение в моём ответе, там ещё один вопрос:
Qwertiy писал(а):4. Как определить "нужное место"? И как это будет работать, если уже есть выделенный текст?


Хакер писал(а):SendKeys works exactly as if you are typing on your keyboard (не дословно)

А вот MSDN дословно:
MSDN писал(а):Каждая клавиша представляется одним или несколькими символами. Чтобы указать одиночный символ, вводимый клавиатуры, используется этот символ. Например, для представления буквы A передайте методу строку "A". Чтобы представить несколько символов, каждый дополнительный символ нужно добавлять к предыдущему. Так, для представления букв A, B и C следует в качестве параметра указать "ABC".
В английском варианте написано то же самое.
Вообще, если смотреть, как оно работает реально, то... Ой. Сейчас на семёрке x64. Я же проверял в прошлый раз на другой семёрке :(
В общем, работает вообще не так, как я описывал. Если стоит русский язык, то всё набирается как надо, если английский, то русские буквы заменяются на английские. А если включить Caps Lock, то регистр меняется на противоположный только букв, записанных в посылаемой строке как русские, а у тех, что изначально были английскими - остаётся без изменений.
Похоже, действительно стоит подумать о другом способе :(

Хакер писал(а):Какого? И в чём проблема?

В идеале - любого. Насколько я понимаю, страница отображается в одном контроле, однако перетаскивание в текстовое поле на ней возможно, а на саму страницу - нет. Опера отвечает на GetCarretPos, хотя в итоге моё меню появляется на пару сантиметров выше, а от Хрома вообще координаты получить не удаётся.
Из VS2010 координаты тоже не выковыриваются. И из консоли.

Хакер писал(а):А зачем все? Ты меняешь CF_TEXT, шлёшь WM_PASTE, меняешь CF_TEXT на то, что там было раньше. WM_PASTE работает только для CF_TEXT.

Хм... Про такой вариант я не думал. Просто, если я поменяю текст средствами .NET, то все остальные форматы будут выкинуты. А ты уверен, что, например, Word будет вставлять именно plain text (да и вообще будет что-то вставлять) при получении WM_PASTE? А консоль будет? Всё-таки возникают сомнения в универсальности этого метода - я хочу получить программу, способную работать со всеми (по-возможности) видами программ и контролов.

Хакер писал(а):Если я не ошибусь с предположением, то можно пойти на максимум — взять 64 для всех параметров. Что, неужели в дотнете для отправки оконных сообщений надо декларировать WinAPI-функцию? И нет никакой встроенной ООП-ной фигнюльки для выполнения этой задачи? Бюэ.

По крайней мере, мне неизвестно о её наличии. Если в объявлении битность параметров будет неверной, то по идее оно не должно нормально работать? Хотя, реально оно работало с обоими вариантами, кажется. Wparam и lparam могут содержать указатели, отсюда делаю вывод, что они 64х-битные, а вот с хендлом и самим сообщением всё не так очевидно...

Хакер писал(а):Не понял связи между сказанным. Подробнее.

Проводник считает переименование законченным, как только его окно теряет фокус. Поэтому, хочу сделать работу с меню так, чтобы не было необходимости делать его активным окном. Для этих целей приходит в голову перехват нажатий клавиш (ну и мыши, при желании). Вот и спрашиваю, можно ли его сделать без установки глобального хука.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Программа для вставки текста

Сообщение Хакер » 17.06.2012 (Вс) 16:14

Qwertiy писал(а):А вот MSDN дословно:

Ну и?

Qwertiy писал(а):В английском варианте написано то же самое.
Вообще, если смотреть, как оно работает реально, то... Ой. Сейчас на семёрке x64. Я же проверял в прошлый раз на другой семёрке :(
В общем, работает вообще не так, как я описывал. Если стоит русский язык, то всё набирается как надо, если английский, то русские буквы заменяются на английские. А если включить Caps Lock, то регистр меняется на противоположный только букв, записанных в посылаемой строке как русские, а у тех, что изначально были английскими - остаётся без изменений.
Похоже, действительно стоит подумать о другом способе :(

Это поведение в соответствии с документацией должно считаться багом. Посыл «Яz», «яZ», «яz» и «ЯZ» при выбранной английской раскладке должен во всех четырёх случаях приводить к набору «zz». Посыл этих же сочетаний при выбранной русской раскладке должен во всех четырёх случаях приводить к набору «яя». Потому что нет отдельны клавиш «Я» и «я» и нет отдельных клавишь «Я» и «Z».


Qwertiy писал(а):В идеале - любого.

Если речь про драгндроп, то я так и не понимаю, в чём вообще проблема? Определить координаты, по которым должен произойти дроп, что-ли?

Qwertiy писал(а):И из консоли.

Консоль-то здесь причём? Консоль сюда вообще никаким боком.

Qwertiy писал(а):Просто, если я поменяю текст средствами .NET, то все остальные форматы будут выкинуты.

В топку глупый дотнет, в таком случае.

Qwertiy писал(а):А ты уверен, что, например, Word будет вставлять именно plain text (да и вообще будет что-то вставлять) при получении WM_PASTE?

Будет, я почти уверен.

Qwertiy писал(а):А консоль будет?

Хватит вспоминать про консоль. С консолью ты ни сделаешь вообще ничего.

Qwertiy писал(а):По крайней мере, мне неизвестно о её наличии. Если в объявлении битность параметров будет неверной, то по идее оно не должно нормально работать? Хотя, реально оно работало с обоими вариантами, кажется. Wparam и lparam могут содержать указатели, отсюда делаю вывод, что они 64х-битные, а вот с хендлом и самим сообщением всё не так очевидно...

Ещё раз, если сделать всё 64-битным, почему по-твоему будут проблемы? В 32-битных ОС, и 32-битные и 16-битные и 8-битные параметры при укладке в стек перед вызовом выравниваются по 4-байтной границе. Я думаю в 64-битной архитектуре этот принцип сохранили?


Qwertiy писал(а):Проводник считает переименование законченным, как только его окно теряет фокус. Поэтому, хочу сделать работу с меню так, чтобы не было необходимости делать его активным окном. Для этих целей приходит в голову перехват нажатий клавиш (ну и мыши, при желании). Вот и спрашиваю, можно ли его сделать без установки глобального хука.

Глупость какая-то. Если в момент переименования нажать клавишу [CtxMenu] на клавиатуре, то меню (проводниковое) появляется, и переименование не завершается. Раз есть такое дело, надо просто своё меню показывать на тех же правах, на которых показывается контекстное меню при нажатии клавиши [CtxMenu] во время переименования.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 17.06.2012 (Вс) 16:31

Хакер писал(а):Если речь про драгндроп, то я так и не понимаю, в чём вообще проблема? Определить координаты, по которым должен произойти дроп, что-ли?

В том числе, да. Кроме того, не понятно, какие они должны быть, если текст выделен, чтобы его заменить.

Хакер писал(а):Хватит вспоминать про консоль. С консолью ты ни сделаешь вообще ничего.

Код, который есть сейчас, делает :)

Хакер писал(а):Это поведение в соответствии с документацией должно считаться багом. Посыл «Яz», «яZ», «яz» и «ЯZ» при выбранной английской раскладке должен во всех четырёх случаях приводить к набору «zz». Посыл этих же сочетаний при выбранной русской раскладке должен во всех четырёх случаях приводить к набору «яя». Потому что нет отдельны клавиш «Я» и «я» и нет отдельных клавишь «Я» и «Z».

Я говорю о том, что есть. Кстати, а можно ссылку на документацию?
Math.Cos(1e20) - тоже баг, но его никто не исправил до сих пор.

Хакер писал(а):Ещё раз, если сделать всё 64-битным, почему по-твоему будут проблемы? В 32-битных ОС, и 32-битные и 16-битные и 8-битные параметры при укладке в стек перед вызовом выравниваются по 4-байтной границе. Я думаю в 64-битной архитектуре этот принцип сохранили?

Если я вместо 4 байт запихаю в стек 8 или наоборот, то выравнивание это компенсирует?

Хакер писал(а):Глупость какая-то. Если в момент переименования нажать клавишу [CtxMenu] на клавиатуре, то меню (проводниковое) появляется, и переименование не завершается. Раз есть такое дело, надо просто своё меню показывать на тех же правах, на которых показывается контекстное меню при нажатии клавиши [CtxMenu] во время переименования.

Оно же не принадлежит другому приложению. Скорее всего он что-то типа потери фокуса окном обрабатывает.
Я проверил, что если показать меню, но не делать его активным, то переименование не завершается.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Программа для вставки текста

Сообщение Хакер » 17.06.2012 (Вс) 16:34

Qwertiy писал(а):Если я вместо 4 байт запихаю в стек 8 или наоборот, то выравнивание это компенсирует?

Есть мнение, что в стек всегда засовываются 8. Дизасмни любую x86-программу и посмотри.

Qwertiy писал(а):Я говорю о том, что есть. Кстати, а можно ссылку на документацию?

http://msdn.microsoft.com/en-us/library/aa266279%28v=vs.60%29.aspx :roll:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Программа для вставки текста

Сообщение ger_kar » 17.06.2012 (Вс) 19:01

Хакер писал(а):Есть мнение, что в стек всегда засовываются 8. Дизасмни любую x86-программу и посмотри.

Это для 64 битной архитектуры имелось ввиду? Ибо для 32 двух битной это в принципе невозможно. В 32 -х битной в стек пакуется 4 байта х 8 бит = 32 бита. Если смотреть в отладчике то 1 байт представлен двумя шестнадцатеричными символами и таким образом 4 байта отображаются как 8 символов. Или я вообще что то не так понял?
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 17.06.2012 (Вс) 20:52


Ничего нового по сравнению с моей ссылкой, к сожалению...

ger_kar писал(а):Это для 64 битной архитектуры имелось ввиду?

Естественно. В 32-битной указатель тоже 32-битный.

А что-нибудь по теме?

PS: А почему код никому не интересен? 3 скачивания, из которых 2 - мои...

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Программа для вставки текста

Сообщение ger_kar » 17.06.2012 (Вс) 20:56

Qwertiy писал(а):PS: А почему код никому не интересен?
Ну, я разбираюсь в дотнете так же как в балете :) , поэтому смысла мне смотреть на него нет. А про других не знаю.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 17.06.2012 (Вс) 21:21

ger_kar писал(а):Ну, я разбираюсь в дотнете так же как в балете :) , поэтому смысла мне смотреть на него нет. А про других не знаю.

Ты же любишь с WinApi играться ;) К тому же, там exe'шник есть - можно просто посмотреть, потестировать :)

Правда, я там уже баг нашёл.

Text Typer 2.7z
Исправленный вариант
(8.34 Кб) Скачиваний: 362

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Программа для вставки текста

Сообщение ger_kar » 17.06.2012 (Вс) 21:26

Протестировать это конечно можно, но меня постиг облом, нет на моем компьютере .NET Framework 4.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 17.06.2012 (Вс) 21:41

ger_kar писал(а):Протестировать это конечно можно, но меня постиг облом, нет на моем компьютере .NET Framework 4.

:shock: А 3.5 есть?

Text Typer 2 [.NET 3.5].7z
Для .NET 3.5
(8.05 Кб) Скачиваний: 372

Использовать более раннюю версию не вижу смысла:
MSDN писал(а):The SendKeys class has been updated for the .NET Framework 3.0 to enable its use in applications that run on Windows Vista. The enhanced security of Windows Vista (known as User Account Control or UAC) prevents the previous implementation from working as expected.


Да, вспомнил... Когда показывается меню, оно появляется на панели задач. Как этого избежать?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 17.06.2012 (Вс) 22:18

Ещё варианты работы :(
Код: Выделить всё
Text      : ВАПРОЛДпролдж SDDFGHhjklyui

Lang Caps : Windows XP SP3 x32 Home Rus ; Windows 7 SP1 x64 Pro Rus 
En   Off  : ВАПРОЛДпролдж SDDFGHhjklyui ; Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!??? SDDFGHhjklyui
En   On   : ВАПРОЛДпролдж sddfghHJKLYUI ; Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!??? sddfghHJKLYUI
Ru   Off  : ВАПРОЛДпролдж ЫВВАПРролднгш ; ВАПРОЛДпролдж ЫВВАПРролднгш
Ru   On   : ВАПРОЛДпролдж ыввапрРОЛДНГШ ; ВАПРОЛДпролдж ыввапрРОЛДНГШ


PS: Ну а в коде-то какого чёрта знаки вопроса заменяются???

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 18.06.2012 (Пн) 0:05

Хакер писал(а):шлёшь WM_PASTE

Не работает почти со всеми программами. Что проверил:
работает:
- Notepad++ (условно, если есть выделение столбцами, то работает не так, как я хочу)
- Текстовые поля
не работает:
- Open Office.org 3.4
- Visual Studio 2010
- Консоль
- Опера
- Хром
- KingSoft Writer 2012

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 18.06.2012 (Пн) 7:34

Хакер писал(а):я бы для эдитбоксов, поддерживающих драг-н-дроп, эмулировал бы дроп нужного текста в нужное место

Как это сделать?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Программа для вставки текста

Сообщение Хакер » 18.06.2012 (Пн) 9:30

Хакер писал(а):Дизасмни любую x86-программу и посмотри.

Опечатка. Имелось в иду дизасмнуть любую 64-битную программу.

ger_kar писал(а):Если смотреть в отладчике то 1 байт представлен двумя шестнадцатеричными символами и таким образом 4 байта отображаются как 8 символов. Или я вообще что то не так понял?

Чё за бред? Имелось в виду, что по крайней мере в отношении 32-битных программ спреведливо, что аргументы типа Byte, Integer и Long будут все три пушнуты как 4 байта, а не как 1, 2, и 4 байта соответственно. Было предположение, что аналогичное справедливо и для 64-битных программ. То есть что байтовый, двухбайтовый, четырёхбайтовый и восьмибайтовый аргументы, что все четре будут пушнуты как 8 байт.

Qwertiy писал(а):Как это сделать?

Один поток вызывает DoDragDrop, второй поток делает mouse_event-ы в нужное место.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

След.

Вернуться в Windows-программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

    TopList