Хакер писал(а):Почему топик в этом разделе?
Хакер писал(а):Какой результат работы ты ожидаешь
Хакер писал(а):и какой результат работы ты получаешь
Хакер писал(а):А зачем вообще всё это надо?
Хакер писал(а):Если это нечто вроде буфера, с чего ради надо использовать SendKeys?
Qwertiy писал(а):2. В Проводнике при переименовании нажимаю Win+V. В тот момент, когда меню активно, поля переименования уже нет. Соответственно при выборе чего-либо из меню, я не получаю желаемого результата.
Qwertiy писал(а):3. Не всегда удаётся определить положение курсора с помощью функции GetCaretPos. Есть ли какие-либо другие способы, в том числе применимые только к конкретным видам окон/программам?
Qwertiy писал(а):4. Если в программе, из которой вызывается меню была русская раскладка, то вместо английских символов набираются русские. Но по этому поводу я ещё собираюсь поизучать эту тему.
Хакер писал(а):Ну я дотнетный код смотреть не буду в любом случае. Нечем.
Хакер писал(а):Каким образом показывается меню?
CtxMenu.Show(Pos.X, Pos.Y)
SetForegroundWindow(CtxMenu.Handle)
Хакер писал(а):Если реализация контрола не использует системные возможности по отображению и управлению кареткой, то вообще никак, разумеется.
Хакер писал(а):Если верить документации функции, то так (и никак иначе) и должно быть.
Хакер писал(а):с чего ради надо использовать SendKeys?
Qwertiy писал(а):Ну да, это логично. Просто надо определить язык, поменять его на время набора текста, а потом вернуть обратно
Или можно лучше?
Qwertiy писал(а):Да, ещё вопрос. Объявление функций WinApi. Где надо использовать Integer, а где IntPtr? Я так понимаю, на x64 с этим могут быть проблемы?
Хакер писал(а):Если строго верить документации по 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, предварительно внедрившись в целевой процесс и перехватив оттуда попытку прочитать из буфера обмена настоящий текст, подменив его своим текстом. А если это невозможно, заменил бы текст в буфере обмена на свой текст. Но по правде говоря я бы и так не делал, я бы для эдитбоксов, поддерживающих драг-н-дроп, эмулировал бы дроп нужного текста в нужное место.
Хакер писал(а):Это всецело дотнетовские заморочки, откуда нам в разделе по чистому WinAPI это знать?
Хакер писал(а):Да и вообще, зачем использовать дотнет, если 95 % кода — вызовы WinAPI?
Qwertiy писал(а):Не работает с переименованием в Проводнике и подобных ему диалогами.
Qwertiy писал(а):Ты это предупреждение так понимаешь, или что-то ещё?
Qwertiy писал(а):1. Как узнать, что именно поддерживает конкретный контрол?
Qwertiy писал(а):2. Обычные текстовые поля перетаскивание не поддерживают. В моём коде специально запоминается и восстанавливается выделение, чтобы можно было с ними нормально работать.
Qwertiy писал(а):3. Как попытку перетаскивания поймёт окно браузера?
Qwertiy писал(а):4. Я не хочу изменять содержимое буфера. К тому же, если его всё-таки изменить, то очень хочется после вставки вернуть назад то, что там было. Не искал, но не очень представляю, как собрать все форматы.
Qwertiy писал(а):Сколько бит в хендле окна, wparam, lparam, сообщении в SendMessage?
Qwertiy писал(а):Склоняюсь к перехвату нажатий клавиш при отображаемом меню, т. е. не делать меню активным окном. Для этого нужно ставить хук, или есть другие способы?
Qwertiy писал(а):4. Как определить "нужное место"? И как это будет работать, если уже есть выделенный текст?
Хакер писал(а):SendKeys works exactly as if you are typing on your keyboard (не дословно)
В английском варианте написано то же самое.MSDN писал(а):Каждая клавиша представляется одним или несколькими символами. Чтобы указать одиночный символ, вводимый клавиатуры, используется этот символ. Например, для представления буквы A передайте методу строку "A". Чтобы представить несколько символов, каждый дополнительный символ нужно добавлять к предыдущему. Так, для представления букв A, B и C следует в качестве параметра указать "ABC".
Хакер писал(а):Какого? И в чём проблема?
Хакер писал(а):А зачем все? Ты меняешь CF_TEXT, шлёшь WM_PASTE, меняешь CF_TEXT на то, что там было раньше. WM_PASTE работает только для CF_TEXT.
Хакер писал(а):Если я не ошибусь с предположением, то можно пойти на максимум — взять 64 для всех параметров. Что, неужели в дотнете для отправки оконных сообщений надо декларировать WinAPI-функцию? И нет никакой встроенной ООП-ной фигнюльки для выполнения этой задачи? Бюэ.
Хакер писал(а):Не понял связи между сказанным. Подробнее.
Qwertiy писал(а):А вот MSDN дословно:
Qwertiy писал(а):В английском варианте написано то же самое.
Вообще, если смотреть, как оно работает реально, то... Ой. Сейчас на семёрке x64. Я же проверял в прошлый раз на другой семёрке
В общем, работает вообще не так, как я описывал. Если стоит русский язык, то всё набирается как надо, если английский, то русские буквы заменяются на английские. А если включить Caps Lock, то регистр меняется на противоположный только букв, записанных в посылаемой строке как русские, а у тех, что изначально были английскими - остаётся без изменений.
Похоже, действительно стоит подумать о другом способе
Qwertiy писал(а):В идеале - любого.
Qwertiy писал(а):И из консоли.
Qwertiy писал(а):Просто, если я поменяю текст средствами .NET, то все остальные форматы будут выкинуты.
Qwertiy писал(а):А ты уверен, что, например, Word будет вставлять именно plain text (да и вообще будет что-то вставлять) при получении WM_PASTE?
Qwertiy писал(а):А консоль будет?
Qwertiy писал(а):По крайней мере, мне неизвестно о её наличии. Если в объявлении битность параметров будет неверной, то по идее оно не должно нормально работать? Хотя, реально оно работало с обоими вариантами, кажется. Wparam и lparam могут содержать указатели, отсюда делаю вывод, что они 64х-битные, а вот с хендлом и самим сообщением всё не так очевидно...
Qwertiy писал(а):Проводник считает переименование законченным, как только его окно теряет фокус. Поэтому, хочу сделать работу с меню так, чтобы не было необходимости делать его активным окном. Для этих целей приходит в голову перехват нажатий клавиш (ну и мыши, при желании). Вот и спрашиваю, можно ли его сделать без установки глобального хука.
Хакер писал(а):Если речь про драгндроп, то я так и не понимаю, в чём вообще проблема? Определить координаты, по которым должен произойти дроп, что-ли?
Хакер писал(а):Хватит вспоминать про консоль. С консолью ты ни сделаешь вообще ничего.
Хакер писал(а):Это поведение в соответствии с документацией должно считаться багом. Посыл «Яz», «яZ», «яz» и «ЯZ» при выбранной английской раскладке должен во всех четырёх случаях приводить к набору «zz». Посыл этих же сочетаний при выбранной русской раскладке должен во всех четырёх случаях приводить к набору «яя». Потому что нет отдельны клавиш «Я» и «я» и нет отдельных клавишь «Я» и «Z».
Хакер писал(а):Ещё раз, если сделать всё 64-битным, почему по-твоему будут проблемы? В 32-битных ОС, и 32-битные и 16-битные и 8-битные параметры при укладке в стек перед вызовом выравниваются по 4-байтной границе. Я думаю в 64-битной архитектуре этот принцип сохранили?
Хакер писал(а):Глупость какая-то. Если в момент переименования нажать клавишу [CtxMenu] на клавиатуре, то меню (проводниковое) появляется, и переименование не завершается. Раз есть такое дело, надо просто своё меню показывать на тех же правах, на которых показывается контекстное меню при нажатии клавиши [CtxMenu] во время переименования.
Qwertiy писал(а):Если я вместо 4 байт запихаю в стек 8 или наоборот, то выравнивание это компенсирует?
Qwertiy писал(а):Я говорю о том, что есть. Кстати, а можно ссылку на документацию?
Хакер писал(а):Есть мнение, что в стек всегда засовываются 8. Дизасмни любую x86-программу и посмотри.
ger_kar писал(а):Это для 64 битной архитектуры имелось ввиду?
Ну, я разбираюсь в дотнете так же как в балете , поэтому смысла мне смотреть на него нет. А про других не знаю.Qwertiy писал(а):PS: А почему код никому не интересен?
ger_kar писал(а):Ну, я разбираюсь в дотнете так же как в балете , поэтому смысла мне смотреть на него нет. А про других не знаю.
ger_kar писал(а):Протестировать это конечно можно, но меня постиг облом, нет на моем компьютере .NET Framework 4.
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.
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 : ВАПРОЛДпролдж ыввапрРОЛДНГШ ; ВАПРОЛДпролдж ыввапрРОЛДНГШ
Хакер писал(а):шлёшь WM_PASTE
Хакер писал(а):я бы для эдитбоксов, поддерживающих драг-н-дроп, эмулировал бы дроп нужного текста в нужное место
Хакер писал(а):Дизасмни любую x86-программу и посмотри.
ger_kar писал(а):Если смотреть в отладчике то 1 байт представлен двумя шестнадцатеричными символами и таким образом 4 байта отображаются как 8 символов. Или я вообще что то не так понял?
Qwertiy писал(а):Как это сделать?
Вернуться в Windows-программирование
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9