purebasic.info

PureBasic forum
Текущее время: Пт фев 21, 2020 5:42 pm

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




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

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


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

Зарегистрирован: Сб окт 31, 2009 7:44 am
Сообщений: 173
Благодарил (а): 117 раз.
Поблагодарили: 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
Сообщений: 1799
Откуда: Алматы
Благодарил (а): 18 раз.
Поблагодарили: 50 раз.
Пункты репутации: 5
а еще она может быть не чувствительна к окну. своеобразный хот кей можно сделать, когда твоя программа не в фокусе :)

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


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

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 918
Благодарил (а): 99 раз.
Поблагодарили: 30 раз.
Пункты репутации: 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
Сообщений: 173
Благодарил (а): 117 раз.
Поблагодарили: 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
Сообщений: 380
Благодарил (а): 1 раз.
Поблагодарили: 17 раз.
Пункты репутации: 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
Сообщений: 380
Благодарил (а): 1 раз.
Поблагодарили: 17 раз.
Пункты репутации: 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
Сообщений: 173
Благодарил (а): 117 раз.
Поблагодарили: 5 раз.
Пункты репутации: 0
Цитата:
думаетсо что ты ее так и недопилил, ну и в составе твоей проги неработает, ну может что не в цикле стоит без условий. Да и сугубо отфильтрована она тута If r>41 And r<155 эт значит пробел и !@#$%^&*()*

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

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


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

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

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


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


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

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6596
Благодарил (а): 32 раз.
Поблагодарили: 227 раз.
Пункты репутации: 59
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
Сообщений: 918
Благодарил (а): 99 раз.
Поблагодарили: 30 раз.
Пункты репутации: 5
Только сильно не ржать.
Это я чудо криворукое засунул в цикл создание канваса, вот винда мне все созданные канвасы и показывала. :shock:
До проверки как жрёт память прога пока не дошло, так бы сразу засёк. :D


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

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 380
Благодарил (а): 1 раз.
Поблагодарили: 17 раз.
Пункты репутации: 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
Сообщений: 173
Благодарил (а): 117 раз.
Поблагодарили: 5 раз.
Пункты репутации: 0
Цитата:
А по поводу недопили я имею введе что процедура опроса стоит вне цикла и опрашивается всего один раз после создания проги
- я же написал, работает и так)
То, что при долгом нажатии (залипании) кнопки повторно шлются однотипные сообщения - это особенность винды,. Наверное, надо обрабатывать сообщение отжатия клавиши #WM_KEYUP, после отлова нажатия через GetAsyncKeyState (или #WM_KEYDOWN)


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

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 380
Благодарил (а): 1 раз.
Поблагодарили: 17 раз.
Пункты репутации: 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


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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: GetAsyncKeyState_()
СообщениеДобавлено: Вс дек 15, 2019 9:40 am 
Не в сети
доцент

Зарегистрирован: Пн янв 23, 2017 11:04 am
Сообщений: 44
Благодарил (а): 4 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
мучаюсь с этой GetAsyncKeyState_(), когда конвертю старую дос-прогу в винду. В досе (да и в консоле ) есть такая мне удобная функция, как inkey(). И вот мне она очень нужна. Вообщем. я порылся, но так и ничего путного не нашел. Возможно, не знаю, возможно, вообще все сделал не так. Но написал для себя аналог этой inkey под винду. За основу взял код от balex1978, короче, может кому и покажется удобным. Функция выдает ASCII код большинства нажатых клавиш. Первый ряд клавы писать не стал, кто хочет- сам допишет, он мне не нужен. Сильно не критикуйте, я не программер ни разу )
(ах да, клавиши типа F1-F10 возвращают 2-х байтное число, поэтому нужно проверять это, в примере все есть)
Код:
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
 
Procedure.s inkeyW() ;выдает ASCII коды нажатых клавиш
  ; НЕ включен первый ряд клавиатуры, в комбинации  шифтом и капсом
 
          If GetKeyState_(#VK_CAPITAL) And $1000 ; состояние CAPSLOCK
             Caps=1                               ;Caps lock нажат
            Else
             Caps=0 ;Caps lock не нажат
          EndIf
         ; Debug Caps  
           
         If GetKeyState_(#VK_SHIFT) & $8000 ; =65409
           Shift=1                               ;шифт нажат
          Else
           Shift=0 ;шифт не нажат
         EndIf
         ;  Debug Shift
           
 a1$=""
  For r=4 To 255 ;
    Q=GetAsyncKeyState_(r)
    Select Q
        Case 0
        Case 1 ; отпуcтили после залипания(долгого нажатия)"
        Case -32768; однократное нажатие?
        Case 32768; когда клавишу зажали
           
        Default; какой-то нормальный код совпал
          Select r
            Case 33 ;PgUP
              a1$="1"+Chr(73)
            Case 34 ;PgDn
              a1$="1"+Chr(81)
            Case 35 ;End
              a1$="1"+Chr(79)
            Case 36 ;Home
              a1$="1"+Chr(71)
            Case 37 ;влево
              a1$="1"+Chr(75)
            Case 38 ;вверх
              a1$="1"+Chr(72)
            Case 39 ;вправо
              a1$="1"+Chr(77)
            Case 40 ;вниз
              a1$="1"+Chr(80)
            Case 40 ;
              a1$="1"+Chr(11)
            Case 45 ; Ins
              a1$="1"+Chr(82)
            Case 46 ;Del
              a1$="1"+Chr(83)
            Case 187 ; = равно
              a1$=Chr(61) ;
            Case 189 ; - минус
              a1$=Chr(45) ;
             
           
            Case 8,9,13,27,32 ; это от BackSpace=8, TAB=9, пробел
              a1$=Chr(r)
             
            Case 48 To 64 ; 1,2,3,4,5,....!@##$%^^ пока не ясно, что с этим делать <================================================================================
             If (Caps=1 And Shift=1) Or (Caps=0 And Shift=0) ;капс нажат и шифт нажат или все отжато
                a1$=Chr(r) ;Debug "это 1 2 3 ... " +a1$
              EndIf
             
           ;  тут надо дописывать код, в обыных программах вряд ли тебе потребуется инфа отсюда<============================================================================  
             
           ;   If (Caps=0 And  Shift=1) Or (Caps=1 And  Shift=0) ;капс НЕнажат и шифт нажат или наоборот
           ;     a1$=Chr(r) ; это большая буква
           ;     ;Debug "это БОЛЬШАЯ буква " +a1$
           ;   EndIf
             
             
            Case 65 To 90 ; A(a) to Z(z) т.к. по умолчанию система не различает Y от y и генерит им одинаковый код, я буду считать, что нажали малую букву, а ниже поправлю, если что
             
              If (Caps=1 And Shift=1) Or (Caps=0 And Shift=0) ;капс нажат и шифт нажат или все отжато
                a1$=Chr(r+32) ;Debug "это маленькая буква " +a1$
              EndIf
             
              If (Caps=0 And  Shift=1) Or (Caps=1 And  Shift=0) ;капс НЕнажат и шифт нажат или наоборот
                a1$=Chr(r) ; это большая буква
                ;Debug "это БОЛЬШАЯ буква " +a1$
              EndIf
                                       
            Case 112 To 121 ;F1-F10
                a1$="1"+Chr(r-53) ; что я делаю, я преобразую ASCII код F-клавиши так, чтобы при обратном преобразовании путем отбрасывания старшего бита а применение к оставшимся ASC() получался ASCII код
            Case 122 To 123 ;F11-F12
                a1$="1"+Chr(r+11)
            Default
             
          EndSelect
           ; Debug Str(Q)+" "+Chr(R)+" = "+Str(R)+" *"  ; тут всегда можно посмотреть, что творится с клавой или мышкой
        EndSelect
      Next
      Delay(70)
      ;==========
     ;a1$=Chr(Val(a1$))
      ProcedureReturn a1$
EndProcedure
 
While g<>27
g$=inkeyW()
If Len(g$)=0:g=0:EndIf
If Len(g$)=1:g=Asc(g$):EndIf
If Len(g$)=2:g=Asc(Right(g$,1)):EndIf
If g<>0
  Debug g
 
 EndIf
Wend
 


_________________
.


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

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


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

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


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

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