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

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

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

Сообщение ger_kar » 18.06.2012 (Пн) 10:10

Хакер писал(а):Чё за бред?
Никакс нет :) Это все твоя опечатка
Хакер писал(а):Есть мнение, что в стек всегда засовываются 8. Дизасмни любую x86-программу и посмотри
Чего 8 может быть засунуто в 32 битной программе? Что конкретно не написано. Значит что-то не так. Либо ты ошибся с указанием архитектуры, либо
Стек.jpg
Стек.jpg (24.28 Кб) Просмотров: 8437
чего-то 8, но точно не байт, ибо в 32-х 8 байт не поместятся. Это и имелось ввиду :)
А теперь то да, все понятно.
Последний раз редактировалось ger_kar 18.06.2012 (Пн) 10:45, всего редактировалось 1 раз.
Бороться и искать, найти и перепрятать

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

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

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

ger_kar писал(а):чего-то 8, но точно не байт

Нибблов.
—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 » 18.06.2012 (Пн) 10:23

Хакер писал(а):Один поток вызывает DoDragDrop, второй поток делает mouse_event-ы в нужное место.

Во-первых, кто источник? А во-вторых, как определить нужное место?

Код: Выделить всё
Public Class Form1

Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
  Button1.DoDragDrop(Button1.Text, DragDropEffects.Copy Or DragDropEffects.Move)
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
  Button2.DoDragDrop(Button2.Text, DragDropEffects.Copy Or DragDropEffects.Move)
End Sub

End Class
Первая процедура работает, а вторая - нет.

Что с остальными вопросами?

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

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

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

Я вообще-то имел в виду API-функцию DoDragDrop. Хватит упоминать тут дотнет-штучки, иначе придётся перенести топик в раздел по дотнету.

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 » 18.06.2012 (Пн) 11:00

Хакер писал(а):Я вообще-то имел в виду API-функцию DoDragDrop.

Она чем-то принципиально лучше .NET'овской обёртки?

Хакер писал(а):А в чём смысл этого кода? Как он относится к тому, о чём я говорил?

Смысл в том, что кнопка мыши должна быть нажата в момент вызова DoDragDrop. Иначе не работает.

Уже третий раз спрашиваю, как определить координаты приёмника :(

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

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

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

Qwertiy писал(а):Она чем-то принципиально лучше .NET'овской обёртки?

Да. Тем, что дотнетовская обёртка — оффтопик. Мы о ней ничего не знаем и знать не хотим. Насколько она обёртка, насколько она переопределяет поведение и т.п.

Qwertiy писал(а):Смысл в том, что кнопка мыши должна быть нажата в момент вызова DoDragDrop. Иначе не работает.

Ты проверил это в отношении API-функции? (Я уверен, что и там также будет).
Ты уверен, что дело именно в нажатой кнопке мыши, а не в наличии установленного захвата (capture) мыши?
Если да, то я же сказал: один поток вызыват DoDragDrop и блокируется, а второй поток — вызывает mouse_event и управляет мышью.

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 » 18.06.2012 (Пн) 11:32

Хакер писал(а):Ты уверен, что дело именно в нажатой кнопке мыши, а не в наличии установленного захвата (capture) мыши?

Подробнее.

Хакер писал(а):один поток вызыват DoDragDrop и блокируется, а второй поток — вызывает mouse_event и управляет мышью

Можно пример? Я не понимаю ни как вызвать DoDragDrop, ни что делать с мышью.

Хакер писал(а):А как ты до этого определял?

GetCaretPos, которая не работает с кучей окон (см. вопрос 3 в самом первом посте)...

Хакер писал(а):Есть простое стратегическое решение: во время нажатия хоткея указатель должен быть над приёмником.

Издеваешься? Представь, как этим потом пользоваться: печатаешь, взял мышь в руки, навёл на нужное место, нажал Win+V, выбрал, что вставить :(

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

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

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

Qwertiy писал(а):Подробнее.

Что подробнее? Базовое явление, о котором должен знать любой Windows-разработчик. Захват мыши — явление, при котором окно получает сообщения о мышиных событиях не только тогда, когда мышь над ним, но и тогда, когда она вне его. Более строго говоря: получит ли окно сообщение о мышином событии или нет зависит не от результата хит-теста, а от того, не были ли её снят установленный ранее захват. SetCapture / ReleaseCapture.

Qwertiy писал(а):Можно пример? Я не понимаю ни как вызвать DoDragDrop, ни что делать с мышью.

Вряд ли. Ищи и найдёшь.

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

Абсолютно не издеваюсь. По идее приёмник зависит от текущего фокуса окна. Управление фокусом в Windows происходит Tab-ом и кликами по окнам. У какого окна фокус, то и получает ввод. Так вот в чём издевательство, если в некоторых менеджерах X Windows Systems такая концепция управления фокусом принята и используется? Почитай мою статьейку.
—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 » 19.06.2012 (Вт) 22:11

Давай вернёмся к отправке нажатий клавиш. Этот способ должен быть рабочим. Хотя и не понятно, что за фигня получается... Пунтосвитчер же так работает?

По поводу перетаскивания. Его имеет смысл пробовать только если есть способ определить координаты. Мыши для указания в руках быть не должно.
SetCapture позволяет видеть перемешение мыши над окном вместе с его границей, но не вне окна. Без этого - только над клиентской областью окна.

Ещё, из пропущенных вопросов:
1. Как показать меню (с обработкой нажимаемых клавиш), чтобы активное окно не деактивировалось? (Это про Проводник)
2. Почему у меню есть кнопка на панели задач? Как сделать, чтобы её там не было?

PS: Какие-нибудь ещё хорошие идеи есть?

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

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

Сообщение Хакер » 20.06.2012 (Ср) 1:57

Qwertiy писал(а):SetCapture позволяет видеть перемешение мыши над окном вместе с его границей, но не вне окна. Без этого - только над клиентской областью окна.

Не учи меня ерунде. Подчёркнутое — бред и неправда.
—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 » 20.06.2012 (Ср) 7:41

Хакер писал(а):Подчёркнутое — бред и неправда.

Ладно, невнимательно прочитал. Но ведь работает-то так :) Сейчас даже разобрался почему:
If the mouse cursor is over a window created by another thread, the system will direct mouse input to the specified window only if a mouse button is down.
Ты же не сомневался, что я буду эксперементировать с приложением из одной формы?

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

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

Сообщение Хакер » 20.06.2012 (Ср) 9:07

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 » 20.06.2012 (Ср) 9:32

Хакер писал(а):Как так?

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

Вечером скринвидео сделаю, если не веришь.

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

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

Сообщение Хакер » 20.06.2012 (Ср) 9:41

Не надо рассказывать. Я только сейчас ещё раз проверил. И на XP, и на Win 7 (было предположение, что там новые люди из MS действительно могли переделать и сделать всё так, как ты говоришь).

Результаты проверки: и в Win XP и в Win 7 всё работает так, как я говорю. С тех пор, как установлен захват, окно получает мышиные сообщения вне зависимости от того, где и над чьим окном находится мышь. Во всех ОС. И до тех пор, пока захват не будет снят.

Пруф-программа:
disp_capture_proof.zip
(4.58 Кб) Скачиваний: 287
—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 » 20.06.2012 (Ср) 9:48

Хакер писал(а):Пруф-программа:

А тебе не кажется, что
Твоя программа писал(а):Нажать мышку на кресте и утащить куда-нибудь на кнопку «Пуск»
это как раз тот случай, когда кнопка нажата над твоим окном и удерживается во время перемещения?

Вызови SetCapture по клику и посмотри, что получится.
Код: Выделить всё
Imports System.Runtime.InteropServices

Public Class Form1

<DllImport("user32.dll", CharSet:=CharSet.Auto, ExactSpelling:=True)> _
Public Shared Function SetCapture(ByVal hwnd As IntPtr) As IntPtr
End Function

<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True)> _
Public Shared Function ReleaseCapture() As Boolean
End Function

Private Sub Form1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
  Me.Text = e.Location.ToString()
End Sub

Private Sub BtnSetCapture_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSetCapture.Click
  SetCapture(Me.Handle)
End Sub

Private Sub BtnReleaseCapture_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnReleaseCapture.Click
  ReleaseCapture()
End Sub

Private Sub BtnAddForm_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAddForm.Click
  Call (New Form1()).Show()
End Sub

End Class

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

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

Сообщение Хакер » 20.06.2012 (Ср) 10:03

Qwertiy писал(а):Вызови SetCapture по клику и посмотри, что получится.

По клику никак нельзя.
А если вызвать как следует, то да, в Win7 есть такое дело. В Win XP это не относится как минимум к таксбару.

Но причём здесь вообще это? Изначальное предложение было каким? Один поток делает DoDragDrop, другой поток делает mouse_event. В чём проблема?
—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 » 20.06.2012 (Ср) 11:42

Хакер писал(а):другой поток делает mouse_event

Опиши по шагам, какие именно и над какими окнами. И при чём тут тогда SetCapture?

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

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

Сообщение Хакер » 20.06.2012 (Ср) 12:13

Qwertiy писал(а):Опиши по шагам, какие именно и над какими окнами.

Нажали ЛКМ над (псевдо-)источником, двинули указатель на приёмник, отпустили ЛКМ.
SetCapture при том, что (псевдо-)источник вызовет SetCapture в ответ на нажатие ЛКМ. А может и не вызовет, вроде как внутри DoDragDrop тоже должен быть SetCapture.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Пред.

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

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

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

    TopList