Переместить каретку на начало в ComboBox

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Переместить каретку на начало в ComboBox

Сообщение Хакер » 26.03.2009 (Чт) 11:08

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

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Переместить каретку на начало в ComboBox

Сообщение arthur2 » 26.03.2009 (Чт) 19:05

Именно поэтому не хотелось связываться с им параметром. Хотя, tyomitch меня вроде бы успокоил, что сканкоды для стандартных клавиш должны быть снатнадртные.

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

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

Re: Переместить каретку на начало в ComboBox

Сообщение Хакер » 26.03.2009 (Чт) 19:07

Я, вобщем, вот что скажу: я смотрел Spy++-ом сообщения, которые присылаются окну твоим кодом, и которые приходят окну при реальном нажатии данных клавиш. Я видел различия.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Переместить каретку на начало в ComboBox

Сообщение arthur2 » 26.03.2009 (Чт) 20:31

Код: Выделить всё
Public Function winProc(ByVal hwnd As Long _
                  , ByVal uMsg As Long, ByVal wParam As Long _
                  , ByVal lParam As Long) As Long
   Select Case uMsg
   Case WM_KEYDOWN
      Debug.Print "WM_KEYDOWN "; " &h" & Hex(wParam); " &h" & Hex(lParam)
   Case WM_KEYUP
      Debug.Print "WM_KEYUP "; " &h" & Hex(wParam); " &h" & Hex(lParam)
   End Select
   
   CallWindowProc oldPr, hwnd, uMsg, wParam, lParam
   
End Function

результат:
Код: Выделить всё
WM_KEYDOWN  &h10 &h402A0001
WM_KEYDOWN  &h24 &h1470001
WM_KEYUP  &h24 &hC1470001
WM_KEYUP  &h10 &hC02A0001


Третья строка не совпадает (видимо, случайно написал такую же, как вторую - они похожи :)

Исправленный вариант:
Код: Выделить всё
Private Sub Form_Click()
    PostMessage text1.hwnd, WM_KEYDOWN, VK_SHIFT, &H402A0001
    PostMessage text1.hwnd, WM_KEYDOWN, VK_HOME, &H1470001
    PostMessage text1.hwnd, WM_KEYUP, VK_HOME, &HC1470001
    PostMessage text1.hwnd, WM_KEYUP, VK_SHIFT, &HC02A0001
End Sub

Код по-прежнему не работает (конкретно - как и прежде, курсор в начало переносится, но текст не выделяется)

Хакер писал(а):я смотрел Spy++-ом сообщения, которые присылаются окну твоим кодом, и которые приходят окну при реальном нажатии данных клавиш. Я видел различия.

А с теми значениями, которые показал спай - заработает?
Артур
 
   

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 26.03.2009 (Чт) 20:55

Я сделал через keybd_event:
Код: Выделить всё
    keybd_event VK_SHIFT, 0, 0, 0 'press shift
     keybd_event VK_HOME, 0, KEYEVENTF_EXTENDEDKEY, 0

Что интересно, без флага KEYEVENTF_EXTENDEDKEY Cbx_KeyDown принимает клавиши как отдельно нажатые, а с KEYEVENTF_EXTENDEDKEY уже как одновременно нажатые, PostMessage не хочет работать никак :(

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Переместить каретку на начало в ComboBox

Сообщение arthur2 » 26.03.2009 (Чт) 21:08

Space Через keybd_event - это коряво. А чем тебя не устроил рабочий и некривой вариант, который я тебе дал с SetKeyboardState?
Артур
 
   

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Переместить каретку на начало в ComboBox

Сообщение iGrok » 26.03.2009 (Чт) 21:19

Space писал(а):Что интересно, без флага KEYEVENTF_EXTENDEDKEY Cbx_KeyDown принимает клавиши как отдельно нажатые

Ну это как раз вполне логично. Этот флаг, судя по названию, как раз для эмуляции нажатия комбинаций клавиш..
label:
cli
jmp label

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 26.03.2009 (Чт) 21:27

Судя по названию, этот флаг "Расширенные(серые) клавиши".
arthur2 , чем keybd_event - коряво?

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Переместить каретку на начало в ComboBox

Сообщение arthur2 » 26.03.2009 (Чт) 21:48

Когда ты шлёшь сообщение по хендлу, ты не привязан ни к фокусу окна, ни даже к его видимости. А кейэвент - это куда бог пошлет. Собственно, то же самое, что было и с сендкеем.

А ты всегда переспрашиваешь, пропуская вопрос? Чем тебя не устроил нормальный некривой код?
Артур
 
   

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 26.03.2009 (Чт) 22:01

Вообще-то я фокус проверяю там If Screen.ActiveControl.Name = cbx.Name Then ... Ну мне показался этот вариант проще и я как-то подозрительно отношусь к Get/SetKeyboardState...

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Переместить каретку на начало в ComboBox

Сообщение arthur2 » 26.03.2009 (Чт) 22:05

:lol: И чего там такого подозрительного? Особливо - чем подозрительней, чем тот же кейбордэвент?
Артур
 
   

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 26.03.2009 (Чт) 22:18

Ну в промежутке между Get и Set клава может изменить своё состояние, хоть вероятность и мала. Особенно не нравится промежуток между Get и последним Set - 2 SendMessage...
Возвращаясь к проблемам PostMessage - я спрашивал Хакера, почему получается 2 события в cbx_KeyDown на 1 PostMessage? Думаю, что второе событие возникает от неккоректного(непонятно откуда взявшегося) сообщения WM_KEYDOWN, VK_SHIFT, которое разбивает корректную пару сообщений WM_KEYDOWN, VK_SHIFT и WM_KEYDOWN, VK_HOME, поэтому это воспринимается как нажатие отдельных клавиш...

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Переместить каретку на начало в ComboBox

Сообщение arthur2 » 26.03.2009 (Чт) 22:41

В моем коде не post-, а sendmasage и нет дуэвентов, значит ничего в промежутке возникнуть не может :)

Меня интересует другая вещь: у меня в проекте при установке состояния шифта через setkeybordstate текстовое поле вообще невидимо. Значит, ни какое сообщение о нажатии клавиш к нему не приходит. Кроме тех, которые я сам посылаю - WM_KEYDOWN, VK_HOME и WM_KEYUP, VK_HOME.

А раз код работает, то получается, окно не использует сообщения о шифтах, оно само смотрит состояние шифтов в момент прихода VK_HOME.

Я так понимаю, сообщения не меняют состояния клавиш. То-есть, сообщения - только сообщают: состояние изменилось. А раз мы сами их шлём, то просто обманываем окно. Мы сообщаем, что VK_HOME изменилась, хотя она и не менялась. А на шифты окно смотрит не по сообщениям, по состоянию.

Так что, получается, слать VK_SHIFT для выделения текста - бесполезно :)

А кейбордэвент работает именно потому, что не только сообщение шлет, но и состояние клавиш меняет.

Как-то так :)
Последний раз редактировалось arthur2 26.03.2009 (Чт) 22:55, всего редактировалось 2 раз(а).
Артур
 
   

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 26.03.2009 (Чт) 22:51

я говорил не о твоём коде от Тёмыча, а о изначальном варианте:
Код: Выделить всё
    PostMessage cbx.hwnd, WM_KEYDOWN, VK_SHIFT, 0 ' &H402A0001
    PostMessage cbx.hwnd, WM_KEYDOWN, VK_HOME, 0 '&H1470001
    PostMessage cbx.hwnd, WM_KEYUP, VK_HOME, 0 '&H1470001
    PostMessage cbx.hwnd, WM_KEYUP, VK_SHIFT, 0 '&HC02A0001

почему на один WM_KEYDOWN приходится два события cbx_KeyDown?

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Переместить каретку на начало в ComboBox

Сообщение arthur2 » 26.03.2009 (Чт) 23:00

Space Потому что, видимо, они генерируются, пока клавишу не отпустят :)

Хакер Ну так что, прав я или неправ в предыдущем посте?
Артур
 
   

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 26.03.2009 (Чт) 23:15

нет, это же просто сообщения, причём тут нажатые клавиши? Хакера сегодня нет, он где-то в ФСБ доказывает, что он не верблюд :)

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Переместить каретку на начало в ComboBox

Сообщение arthur2 » 27.03.2009 (Пт) 8:19

возьми нормальное готовое решение и не страдай фигней. Поскольку:
В моем коде не post-, а sendmasage и нет дуэвентов, значит ничего в промежутке возникнуть не может :)

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

События приходят парами - это какая-то личная особенность комбика, для текстбокса всё стандартно. Думаю, комбик, приняв сообщение даун, ещё раз для каких-то своих нужд посылает его себе сам :)
Space писал(а):Где энтот вумный Хакер?

Space писал(а):Хакера сегодня нет, он где-то в ФСБ доказывает, что он не верблюд

Хамишь? Это ты так самоутверждаешься?
Артур
 
   

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 27.03.2009 (Пт) 16:32

нет, это я так шучу ;) Хакера я лю, особенно его способность отписыаться отдалёнными намёками. А по поводу Get/SetKeyboardState так твоя прога тут ни при чём, состояние клавы может измениться нажатием юзером кнопы в момент промежутка или тем же SetKeyboardState в другой проге ;)

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Переместить каретку на начало в ComboBox

Сообщение arthur2 » 27.03.2009 (Пт) 16:57

Ещё раз по буквам: внутри кода нет дуэвентов, всё, что нажмётся на клаве за это время, будет обработано после.
Артур
 
   

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 27.03.2009 (Пт) 20:31

ещё раз по буквам: проблема не в этом коде, проблема во внешних событиях, таких, как удар молотком юзверем по клаве в критический момент :D

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Переместить каретку на начало в ComboBox

Сообщение alibek » 27.03.2009 (Пт) 21:29

Space писал(а):ещё раз по буквам: проблема не в этом коде, проблема во внешних событиях, таких, как удар молотком юзверем по клаве в критический момент :D

И что?
Ты не понимаешь, как работает оконный цикл?
Lasciate ogni speranza, voi ch'entrate.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 27.03.2009 (Пт) 21:43

а причём тут оконный цикл? Прога Артура берёт состояние клавы GetKeyboardState, потом юзер зажимает Ctrl, меняет его, потом прога Артура устанавливает SetKeyboardState. Где мой зажатый Ctrl делся?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Переместить каретку на начало в ComboBox

Сообщение alibek » 27.03.2009 (Пт) 22:39

Space, а ты попробуй подумать.
Все события в программе генерируются из оконного цикла. Если программа однопоточная и в ней не используется DoEvents, то никаких событий между двумя операторами не произойдет. Они будут помещены в очередь и сгенерируются после того, как текущая процедура завершит работу.
Lasciate ogni speranza, voi ch'entrate.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 28.03.2009 (Сб) 1:29

а и не надо

Пред.

Вернуться в Visual Basic 1–6

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

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

    TopList