purebasic.info

PureBasic forum
Текущее время: Вт окт 16, 2018 1:10 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: GetAsyncKeyState_()
СообщениеДобавлено: Чт июл 26, 2018 6:47 pm 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 684
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
Как сделать чтобы ловилось одно нажатие, чтобы пока не отпустишь клавишу реакции небыло, а то винда бардак разводит.
Попробовал флаг присобачить, не получилось.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: GetAsyncKeyState_()
СообщениеДобавлено: Чт июл 26, 2018 9:40 pm 
Не в сети
док

Зарегистрирован: Сб окт 31, 2009 7:44 am
Сообщений: 168
Благодарил (а): 92 раз.
Поблагодарили: 5 раз.
Пункты репутации: 0
не проверял на работоспособность, но в составе программы работало:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
Procedure KeyLog()
  Repeat
 For r=4 To 255 ;0..4 - системные бипперы - нафиг не надо
   If GetAsyncKeyState_(r)=-32767 ; эта цифирька означает, что это нажата последняя клавиша чтоб без повторов, с повторами If GetAsyncKeyState_(r) <>0
    If r>41 And r<155
      c$=Chr(r)
      MessageRequester("", c$)  
     EndIf
        EndIf
        Next r
      ForEver  
      ProcedureReturn
EndProcedure


п.с. GetAsyncKeyState нечувствительна к языку ввода и, возможно (не помню), регистру.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: GetAsyncKeyState_()
СообщениеДобавлено: Чт июл 26, 2018 10:48 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1699
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
а еще она может быть не чувствительна к окну. своеобразный хот кей можно сделать, когда твоя программа не в фокусе :)

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: GetAsyncKeyState_()
СообщениеДобавлено: Пт июл 27, 2018 6:38 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 684
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
bizdon, спасибо, я пробовал -3276(8), вообще не работает, а с нулём бардак идёт

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

я на правую кнопку менюху посадил, нормально удаляет
куча субменю, пока доберёшься до нужного пункта, успеешь подумать, зато ни каких окошек с подтверждением
этот фокус давно работает в одной из моих программ, всё нормально, случайное удаление практически нереально
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
CreatePopupImageMenu(#ED0)
MenuBar()
osm1=OpenSubMenu(emb("pop6"), aGet(?purge)); 2 субменю чтобы не кидать окно подтверждения
MenuBar()
osm2=OpenSubMenu(emb("pop6"), aGet(?purge)); удалить с диска, немного разные иконки и текст
MenuItem(1, emb("pop6"), aGet(?purge)); на блокированый путь подставляю, нормально получается
DisableMenuItem(#ED0, 1, 1)
MenuBar()
MenuItem(2, emb("pop8"), aGet(?purAll)); удалить с диска, немного разные иконки и текст
CloseSubMenu()
MenuBar()
CloseSubMenu()
MenuBar()


это подставляет следующий/предыдущий индекс, проблем нет, работает чисто
после закрытия окна в листе остаётся выделенной та картинка, при которой окно закрылось
чеки остаются, если надо их отдельно нужно сбрасывать
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Procedure imgNext(f); F - флаг направления
Protected n, k
k=CountGadgetItems(lig1)-1
n=GetGadgetState(lig1)
 
If f=1; к началу
If n=0; первый элемент
n=k; идём по кругу, подставляем последний
Else
n-1
EndIf
Else; к концу
If n=k
n=0; идём по кругу, подставляем первый
Else
n+1
EndIf
EndIf
 
SetGadgetState(lig1, n)
 
EndProcedure



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: GetAsyncKeyState_()
СообщениеДобавлено: Пт июл 27, 2018 10:06 am 
Не в сети
док

Зарегистрирован: Сб окт 31, 2009 7:44 am
Сообщений: 168
Благодарил (а): 92 раз.
Поблагодарили: 5 раз.
Пункты репутации: 0
newJS
процедура была немного не допилена. Вот рабочий вариант:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Procedure KeyLog()
 For r=4 To 255 ;0..4 - системные бипперы - нафиг не надо
   If GetAsyncKeyState_(r)=-32767 ; эта цифирька означает, что это нажата последняя клавиша чтоб без повторов, с повторами If GetAsyncKeyState_(r) <>0
    If r>41 And r<155
      c$=Chr(r)
     EndIf
        EndIf
        Next r
ProcedureReturn @c$
EndProcedure
 
If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  TextGadget(1,10,10,200,20,"Test",0)
  StringGadget(2,10,30,200,20,"",0)
  KeyLog()
  SetGadgetText(2,c$)
  Repeat
 Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: GetAsyncKeyState_()
СообщениеДобавлено: Пт июл 27, 2018 5:30 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 216
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
Пункты репутации: 0
А чего бардак, нормальный бардак.(мож много нечитать там предположения и теория,думал уже чере таймер пускать, а нет, рабочий код второй)
дело в том что клава при нажатии на кнопку выдает код, если кнопка по прежнему неотпущена то спустя некоторой паузы идут повторы сканкода но пауза меньше.
Эта функция выдает много лишего, чего надо фильтровать, в большой проге это наверное тружновато.
Заметил если долго жать кнопку то выдает 1 вмето -32767, выходит фильтр гдето такой
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
A:
For r=0 To 255
    Q=GetAsyncKeyState_(r)
    Select Q
        Case 0
        Case 1
            Debug "клавиша отпущена после залипания(долгого нажатия)"
        Case -32768; это ненужно, слишком его много и безтолку
           
        Case 32768; это ненужно, слишком его много и безтолку
           
        Default; можэт какойто код появится новый
            Debug Str(Q)+" "+Chr(R)+" = "+Str(R)+" *"
            If r=27:Goto a2:EndIf
    EndSelect
Next
Goto A


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

мож попробовать фильтровать одиночные нажатия и повторы.
для повторов выдает 1 после отпускания(как оказалось невсегда :? ), а как с одиночными ума неприложу.
А может по таймеру следить время после нажатия. Типа если после нажатия прошло столько(гдето секунда) что уже клава выдает повторы, а повторов нету, защитать за отпускание кнопки.

Например выдает (-32768) пока кнопка держится, на моем ПК насчитывает 29-35 повторов(возможно это стабильно, а может от скорости ПК зависит) пережде чем клава войдет в режим повтора нажатий(когда кнопка неотпускается), после идет бредовое чередование (-32767) и (-32768) пока неотпустится кнопка.

в обще пока в поисках , пока ненадоест, точнее и свое делать надо.

НА ЛОВИ, кажется как ты хотел :D
нажимеш клавишу скриншета и пока неодпустиш результата небудит
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Debug #VK_SNAPSHOT
 
W=OpenWindow(0,100,100,100,100,"shot",#PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
r=0:fl=0
Repeat
    Event = WindowEvent()
    Delay(10)
   
    d=GetAsyncKeyState_(44); если тут написать 32 то это пробел
    ;Debug d
    If d = -32767 Or d =1;
       ; Debug " типа скриншот сделать";+Str(r)    :r+1
        fl=1
    EndIf
   
    If d=-32768
        ;Debug " -32768 "
               
    EndIf
    If d=0
        If fl=1
            Debug "ура отпустил наконецто"
            fl=0
        EndIf
    EndIf
   
Until Event = #PB_Event_CloseWindow
;Delay(200); это нужно когда выходиш с проги при нажатии на иконку в систрее то вызывается нажатие клавиши на другой проге.
 


но наверное процедуру опроса через таймер прийдется делать или как выцеплять клавишу если WaitWindowEvent невыдает ничего, ну т. е. совсем стоит. Можно использовать связку WindowEvent(), Delay(10) и каждый раз опрашивать, все зависит од проги, какую лепиш =

_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: GetAsyncKeyState_()
СообщениеДобавлено: Пт июл 27, 2018 6:09 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 216
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
Пункты репутации: 0
bizdon писал(а):
процедура была немного не допилена.

думаетсо что ты ее так и недопилил, ну и в составе твоей проги неработает, ну может что не в цикле стоит без условий. Да и сугубо отфильтрована она тута If r>41 And r<155 эт значит пробел и !@#$%^&*()*+ и короче список ниже
; 160 Shift(L)+16 VK_LSHIFT
; 161 Shift(R)+16 VK_RSHIFT
; 162 Ctrl(L)+17 VK_LCONTROL
; 163 Ctrl(R)+17 VK_RCONTROL
; 164 ALT(L)+18 VK_RMENU?
; 165 ALT(R)+1 ?VK_LMENU
;
; 186 ;
; 187 =
; 188 ,
; 189 -
; 190 .
; 191 /
; 192 Ё ИЛИ ````
;
; 219 [
; 220 \
; 221 ]
вобщем свё это игнорируется.

_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: GetAsyncKeyState_()
СообщениеДобавлено: Пт июл 27, 2018 9:21 pm 
Не в сети
док

Зарегистрирован: Сб окт 31, 2009 7:44 am
Сообщений: 168
Благодарил (а): 92 раз.
Поблагодарили: 5 раз.
Пункты репутации: 0
Цитата:
думаетсо что ты ее так и недопилил, ну и в составе твоей проги неработает, ну может что не в цикле стоит без условий. Да и сугубо отфильтрована она тута If r>41 And r<155 эт значит пробел и !@#$%^&*()*

чтобы печатала эти символы, конечно, надо расширить диапазон в соответствии с таблицей. Если задать от 0 до 255, то будут все символы. То, что вызов не в цикле, а программа продолжает работать - мне самому не понятно (почему процедура шлёт сообшения постоянно, без таймеров и отлова событий, а не срабатывает один раз?)
Цитата:
и короче список ниже

ниже - непечатаемые символы, чтобы их отследит, надо сравнивать код нажатой комбинации со значением, возвращаемым процедурой (возвращать надо число)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: GetAsyncKeyState_()
СообщениеДобавлено: Сб июл 28, 2018 7:14 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 684
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
bizdon, balex1978, спасибо, потом буду смотреть, пока с другим воюю
balex1978 писал(а):
на моем ПК насчитывает 29-35 повторов(возможно это стабильно, а может от скорости ПК зависит)

это есть в настройках винды и скорость повторов и время задержки до включения повторов


в ирфане при просмотре картинок чисто выдаёт следующую картинку и с клавы и колёсиком мышы, работает же
у меня мелькает куча картинок потом останавливается, а если придержать клаву, то не предсказуемо и после этого на короткие нажатия тоже бардель начинается
когда попробую ваши новые коды тогда и решу, или откажусь, можно и без этого, или попробую отдать проге по умолчанию


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: GetAsyncKeyState_()
СообщениеДобавлено: Сб июл 28, 2018 9:52 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6384
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
newJS писал(а):

в ирфане при просмотре картинок чисто выдаёт следующую картинку и с клавы


У меня ирфан при удержании клавиши быстро показывает картинки, с частотой системной настройки повторения букв. Видимо ещё и от компа зависит - успевает отображать или нет?

Если использовать встроенный механизм Пурика AddKeyboardShortcut, то поведение адекватное, картинки мелькают так же при повторе, при одиночном нажатии листаются.
Быстренько накидал такой код листания правой клавишей
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #Image_0
EndEnumeration
;}
 UseJPEGImageDecoder()
;}
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 860, 30, 800, 600, "Листать клавишей Вправо", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    AddKeyboardShortcut(#Window_0,#PB_Shortcut_Left,#PB_Shortcut_Left )
    AddKeyboardShortcut(#Window_0,#PB_Shortcut_Right,#PB_Shortcut_Right)
    ImageGadget(#Image_0, 0, 0, 800, 600, 0, #PB_Image_Border)
  EndIf
EndProcedure
 
Directory$ = "C:\Windows\Web\Wallpaper\Windows\" ; Папка с обоями в win7
Directory$ = PathRequester("Папка с JPG", Directory$)
If Directory$:ExamineDirectory(0, Directory$, "*.jpg"):Else:End:EndIf
OpenWindow_Window_0()
;{- Event loop
Repeat
  Event = WaitWindowEvent()
  Select Event
      ; ///////////////////
    Case #PB_Event_Menu
      Select EventMenu()
        Case #PB_Shortcut_Left
           Debug "Тут листание назад"
        Case #PB_Shortcut_Right
            NextDirectoryEntry(0)
            If DirectoryEntryType(0) = #PB_DirectoryEntry_File
              file$= Directory$ + DirectoryEntryName(0)  
             
              If fileOld$<>file$
                If LoadImage(0,file$)
                  ResizeImage(0,800,600)
                EndIf
                SetGadgetState(#Image_0,ImageID(0))
                fileOld$=file$
              Else
                FinishDirectory(0)
                MessageRequester("","Конец файлов в папке")
                 Directory$ = PathRequester("Новая папка", Directory$)
                 If Directory$:ExamineDirectory(0, Directory$, "*.jpg")  
                 Else:End
                EndIf
              EndIf
            EndIf  
      EndSelect
   
    ; ////////////////////////
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
ForEver
;
;}


_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: GetAsyncKeyState_()
СообщениеДобавлено: Вс июл 29, 2018 6:24 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 684
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
Только сильно не ржать.
Это я чудо криворукое засунул в цикл создание канваса, вот винда мне все созданные канвасы и показывала. :shock:
До проверки как жрёт память прога пока не дошло, так бы сразу засёк. :D


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: GetAsyncKeyState_()
СообщениеДобавлено: Ср авг 01, 2018 4:15 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 216
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
Пункты репутации: 0
Цитата:
тута If r>41 And r<155 эт значит пробел и !@#$%^&*()*
а это выходит непечатаемые символы :? ну ладно.
А по поводу недопили я имею введе что процедура опроса стоит вне цикла и опрашивается всего один раз после создания проги
Код:
1
2
3
4
KeyLog();стоит тута, а должно пониже
  SetGadgetText(2,c$)
  Repeat; тута гдето в обработчике или виндовскалбааке
 Until WaitWindowEvent() = #PB_Event_CloseWindow


и по поводу сработки когда клавиша одпущена уже сделал тебе смотри код выше по словам
Код:
1
Debug "ура отпустил наконецто"

поиском найдеш быстро или вторый пример viewtopic.php?f=1&t=4913&sid=50dae25367c61dc8d6a193a3fb09f815#p89746

_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: GetAsyncKeyState_()
СообщениеДобавлено: Чт авг 02, 2018 8:29 am 
Не в сети
док

Зарегистрирован: Сб окт 31, 2009 7:44 am
Сообщений: 168
Благодарил (а): 92 раз.
Поблагодарили: 5 раз.
Пункты репутации: 0
Цитата:
А по поводу недопили я имею введе что процедура опроса стоит вне цикла и опрашивается всего один раз после создания проги
- я же написал, работает и так)
То, что при долгом нажатии (залипании) кнопки повторно шлются однотипные сообщения - это особенность винды,. Наверное, надо обрабатывать сообщение отжатия клавиши #WM_KEYUP, после отлова нажатия через GetAsyncKeyState (или #WM_KEYDOWN)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: GetAsyncKeyState_()
СообщениеДобавлено: Чт авг 02, 2018 11:10 am 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 216
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
Пункты репутации: 0
Цитата:
я же написал, работает и так)
вот твой пример
viewtopic.php?f=1&t=4913&sid=718ff18cadc2a36ba9c1f477dcc68ad7#p89745
но что в нем работает и как непойму? Когда фокус теряетс со строки ввода(например клацаю по другой проге) то где показывает что прога получает даные, где они выводятся?
тут KeyLog() ты нукуда даные неотправляеш.
Тут SetGadgetText(2,c$) береш пустую строку c$, как минимум она должна былть глобальной, чтобы брать даные из процедуры, ну и эта строчка стоит вне цикла опроса сообщений:
Repeat
WaitWindowEvent()
Until.
Что означет опрос произойдет только один раз и все. Процедура должна опрашиваться очень часто, чтобы анализировать изменения нажатий клавиш, а у тебя только один раз опросиласт, я бы понял если это сделать через таймер, хотя это изврат. В составе твоей проги может и работает, но процедура должна часто опрашиваться и изменения писаться кудато тут Repeat,
WaitWindowEvent(),Until, либо в SetWindowCallback().

Вот моя прога viewtopic.php?f=1&t=4913&sid=718ff18cadc2a36ba9c1f477dcc68ad7#p89746 реально работает независимо активна или нет нажимаеш на кнопку скриншет и в дебугере показывает результат.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Debug #VK_SNAPSHOT
 W=OpenWindow(0,100,100,100,100,"shot",#PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
r=0:fl=0
Repeat
    Event = WindowEvent()
    Delay(10)
    d=GetAsyncKeyState_(44); если тут написать 32 то это пробел
    If d = -32767 Or d =1;
        fl=1
    EndIf
    If d=0
        If fl=1
            Debug "ура отпустил наконецто"
            fl=0
        EndIf
    EndIf
Until Event = #PB_Event_CloseWindow


_________________
искатель истины


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB