PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопрос по горячим клавишам


Вопрос по горячим клавишам

Сообщений 1 страница 30 из 41

1

У меня работают все клавишы клавиатуры с таким кодом (это часть кода  :D ):

HotKeyAdd(WindowID(0), 90, @zapusk3(), "qqq", 0,0,1)

А вот такой код не работает:

HotKeyAdd(WindowID(0), VK_MBUTTON, @zapusk3(), "qqq", 0,0,0)

Почему может не работать нажатие клавиши мыши?

0

2

Это хуки для клавиатуры, а не для мыши.

Вот пример установки хука на правую кнопку мышки

Код:
; English forum:
; Author: Unknown
; Date: 21. January 2003
; OS: Windows
; Demo: No

Global hhook
Procedure MouseProc(nCode, wParam, lParam)
  *ms.MOUSEHOOKSTRUCT = lParam
  SetGadgetText(0, "x: "+Str(*ms\pt\x))
  SetGadgetText(1, "y: "+Str(*ms\pt\y))
  If wParam = #WM_RBUTTONUP ; 205h
    result = 1
    MessageRequester("Message", "Right button up hooked", 0)
  Else
    result = 0
  EndIf
  ProcedureReturn result
EndProcedure
hInstance = GetModuleHandle_(0)
If OpenWindow(0, 0, 0, 300, 200, "Mouse hook example", #PB_Window_SystemMenu)
  WindowID = WindowID(0)
  If CreateGadgetList(WindowID)
    TextGadget(0, 4, 4, 48, 24, "x: ")
    TextGadget(1, 4, 32, 48, 24, "y: ")
  EndIf
  lpdwProcessId = GetWindowThreadProcessId_(WindowID, 0)
  hhook = SetWindowsHookEx_(#WH_MOUSE, @MouseProc(), hInstance, lpdwProcessId)
  Repeat
    EventID = WaitWindowEvent()
  Until EventID = #PB_Event_CloseWindow
EndIf
UnhookWindowsHookEx_(hhook)
End

0

3

Как только я в коде стал использовать HotKeyAdd , функция GetAsyncKeyState  перестала работать. Так и должно быть?

После функции CaptureFullScreen()  где находится снимок?  Я понимаю что они (CaptureFullScreen()  и  SaveCapture) работают в паре. Но мне перед сохранением надо менять размеры

За прошлый ответ спасибо

Отредактировано haav (07.02.2010 14:27:20)

0

4

Вообщем пришлось извращаться:

Код:
CaptureFullScreen()
    SaveCapture("temp.bmp",#PB_ImagePlugin_BMP,10)
    LoadImage(55,"temp.bmp")
  
              ResizeImage(55, 300, 200)


              SaveImage(55, "foto.bmp")

         
    DeleteFile("temp.bmp")

0

5

haav написал(а):

где находится снимок?

Открой исходник друпии и посмотри как там устроены эти функции.
Тогда и извращаться не придётся. :)

0

6

То есть ты имел ввиду брать функцию из друппи и подправить перед сохранением ее?

0

7

Код:
ProcedureDLL SaveCapture(File.s, ImagePlugin , JpegCompression) 
  
  If CaptureScreenBMPHandle
    Id=CreateImage(#PB_Any, CaptureScreenWidth, CaptureScreenHeight) 
    StartDrawing(ImageOutput(id)) 
    DrawImage(CaptureScreenBMPHandle,0,0) 
    StopDrawing()
    
    Select ImagePlugin
      
      Case #PB_ImagePlugin_JPEG 
        UseJPEGImageEncoder()
        Retour=SaveImage(Id, File,#PB_ImagePlugin_JPEG,JpegCompression)
        
      Case #PB_ImagePlugin_PNG
        UsePNGImageEncoder()
        Retour=SaveImage(Id, File,#PB_ImagePlugin_PNG)
        
      Default
        Retour=SaveImage(Id, File)   
        
    EndSelect
    
    FreeImage(Id)
    
  EndIf
  
  ProcedureReturn Retour
EndProcedure

То есть перед SaveImage, я правильно понял

0

8

Код:
Enumeration
  #Window_0
EndEnumeration


Global hhook
Procedure MouseProc(nCode, wParam, lParam)
 
  If wParam = #WM_MBUTTONUP ; 205h
    
    MessageRequester("Message", "Right button up hooked", 0)
 
  EndIf

EndProcedure

Procedure CreateSkrinAll()
End
EndProcedure
Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 600, 300, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
   
  EndIf
EndProcedure
Open_Window_0()
HotKeysInit()
 HotKeyAdd(WindowID(#Window_0), 44, @CreateSkrinAll(), "SkrinAll", 0,0,1)
 
   WindowID = WindowID(#Window_0)
  lpdwProcessId = GetWindowThreadProcessId_(WindowID, 0)
  hhook = SetWindowsHookEx_(#WH_MOUSE, @MouseProc(), hInstance, lpdwProcessId)
 
 Repeat
 Event=HotkeyWaitWindowEvent()
 Until Event=#PB_Event_CloseWindow

Что в этом коде не так? Почему не работает событие средней кнопки мыши?

0

9

haav написал(а):

Почему не работает событие средней кнопки мыши

У меня работает!
Средняя кнопа мышки, обычно находится под колесом.

0

10

Пётр написал(а):

У меня работает!

Что же у меня опять с виндой чего то, ведь недавно менял    :( .  Петр у тебя какая винда?  В каком компиляторе запускал?  Если использую хуки по отдельности то работают, а если вместе в одном коде то клавиши работают, а мышь ни в какую.

0

11

haav написал(а):

у тебя какая винда

"Чистая" ХРюша SP3.

haav написал(а):

В каком компиляторе запускал?

Пробовал в 4.00, 4.10, 4.31 и 4.40.
Работает!

0

12

Пётр написал(а):

"Чистая" ХРюша SP3.

То есть только поставил, или на виртуалке пробуешь?

0

13

haav написал(а):

То есть только поставил

Она установлена почти год назад.
Имел в виду, что это не зверь или другая сборка.

0

14

Петр! а мышка у тебя USB или простая? У меня USB. Вообщем правая кнопка заработала, но средняя никак.

0

15

У меня мышка PS/2
Попробовал с COM-портовой, тоже работает.

0

16

Да и еще вопрос? как я понял этот код работает только при нажатии на  окно #Window_0 . А как сделать чтобы работал при нажатии в любом месте? GetAsyncKeyState_  пробовал, она при использовании функций HotKeysInit()   HotKeyAdd()    у меня вообще не работает, как будто заблокирована.

0

17

haav написал(а):

Да и еще вопрос? как я понял этот код работает только при нажатии на  окно #Window_0 . А как сделать чтобы работал при нажатии в любом месте?

Я так понял что нужно это делать через DLLку.

Вот справка на API функцию SetWindowsHookEx

The SetWindowsHookEx function installs an application-defined hook procedure into a hook chain. An application installs a hook procedure to monitor the system for certain types of events. A hook procedure can monitor events associated either with a specific thread or with all threads in the system. This function supersedes the SetWindowsHook function.

HHOOK SetWindowsHookEx(

    int idHook, // type of hook to install
    HOOKPROC lpfn, // address of hook procedure
    HINSTANCE hMod, // handle of application instance
    DWORD dwThreadId // identity of thread to install hook for
   );

Parameters

idHook

Specifies the type of hook procedure to be installed. This parameter can be one of the following values:

Value Description
WH_CALLWNDPROC Installs a hook procedure that monitors messages before the system sends them to the destination window procedure. For more information, see the CallWndProc hook procedure.
WH_CALLWNDPROCRET Installs a hook procedure that monitors messages after they have been processed by the destination window procedure. For more information, see the CallWndRetProc hook procedure.
WH_CBT Installs a hook procedure that receives notifications useful to a computer-based training (CBT) application. For more information, see the CBTProc hook procedure.
WH_DEBUG Installs a hook procedure useful for debugging other hook procedures. For more information, see the DebugProc hook procedure.
WH_GETMESSAGE Installs a hook procedure that monitors messages posted to a message queue. For more information, see the GetMsgProc hook procedure.
WH_JOURNALPLAYBACK Installs a hook procedure that posts messages previously recorded by a WH_JOURNALRECORD hook procedure. For more information, see the JournalPlaybackProc hook procedure.
WH_JOURNALRECORD Installs a hook procedure that records input messages posted to the system message queue. This hook is useful for recording macros. For more information, see the JournalRecordProc hook procedure.
WH_KEYBOARD Installs a hook procedure that monitors keystroke messages. For more information, see the KeyboardProc hook procedure.
WH_MOUSE Installs a hook procedure that monitors mouse messages. For more information, see the MouseProc hook procedure.
WH_MSGFILTER Installs a hook procedure that monitors messages generated as a result of an input event in a dialog box, message box, menu, or scroll bar. For more information, see the MessageProc hook procedure.
WH_SHELL Installs a hook procedure that receives notifications useful to shell applications. For more information, see the ShellProc hook procedure.
WH_SYSMSGFILTER Installs a hook procedure that monitors messages generated as a result of an input event in a dialog box, message box, menu, or scroll bar. The hook procedure monitors these messages for all applications in the system. For more information, see the SysMsgProc hook procedure.

lpfn

Points to the hook procedure. If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process, the lpfn parameter must point to a hook procedure in a dynamic-link library (DLL). Otherwise, lpfn can point to a hook procedure in the code associated with the current process.

hMod

Identifies the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.

dwThreadId

Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads.

Return Values

If the function succeeds, the return value is the handle of the hook procedure.
If the function fails, the return value is NULL.

Remarks

An error may occur if the hMod parameter is NULL and the dwThreadId parameter is zero or specifies the identifier of a thread created by another process.
Chaining to the next hook procedure (that is, calling the CallNextHookEx function) is optional. An application or library can call the next hook procedure either before or after any processing in its own hook procedure. Although chaining to the next hook is optional, it is highly recommended; otherwise, the other applications that have installed hooks will not receive hook notifications and may behave incorrectly as a result.

Before terminating, an application must call the UnhookWindowsHookEx function to free system resources associated with the hook.
The scope of a hook depends on the hook type. Some hooks can be set only with system scope; others can also be set for only a specific thread, as shown in the following list:

Hook Scope
WH_CALLWNDPROC Thread or system
WH_CBT Thread or system
WH_DEBUG Thread or system
WH_GETMESSAGE Thread or system
WH_JOURNALPLAYBACK System only
WH_JOURNALRECORD System only
WH_KEYBOARD Thread or system
WH_MOUSE Thread or system
WH_MSGFILTER Thread or system
WH_SHELL Thread or system
WH_SYSMSGFILTER System only

For a specified hook type, thread hooks are called first, then system hooks.
The system hooks are a shared resource, and installing one affects all applications. All system hook functions must be in libraries. System hooks should be restricted to special-purpose applications or to use as a development aid during application debugging. Libraries that no longer need a hook should remove the hook procedure.

0

18

УГУ!  :D
Пока попользуюсь горячей клавишей. Как совсем свободен буду изучу. Спасибо Петр!

0

19

Что то у меня с аппаратной частью. Сейчас попробовал на виртуалке на чистой винде, тоже самое: Правую кнопку мыши воспринимает, а среднюю нет. Петр! скажи пожалуйста ты какую версию друппи используешь?  Может в ней дело.

0

20

Разные использую.
Для каждой версии компилятора, своя версия друпии.

0

21

Вообщем нифига не понял как поставить глобальный хук на мышь с использованием dll.  Попробовал #WH_MOUSE_LL   работает, но такие тормоза:
на отлов мыши и событие MessageRequester уходит 3-4 секунды. И конечно в эти 3-4 секунды события нажатия любой клавиши мыши не работают. Да и комп вроде подвисает.

0

22

Вот тут есть кое-что по хукам с использованием DLL http://www.purearea.net/pb/download/use … oteapi.zip

0

23

Пётр написал(а):

Вот тут есть кое-что по хукам с использованием DLL

Спасибо Петр, но там точно не мой уровень. Если уж я с одной API SetWindowsHookEx не могу разобраться, то в этих примерах все в айпишках утыкано.
Первый пример из архива не то, а вот второй мониторинг messagebox, только уж больно сложный он.  :(

0

24

Я написал написал(а):

Вообщем нифига не понял как поставить глобальный хук на мышь с использованием dll.  Попробовал #WH_MOUSE_LL   работает, но такие тормоза:на отлов мыши и событие MessageRequester уходит 3-4 секунды. И конечно в эти 3-4 секунды события нажатия любой клавиши мыши не работают. Да и комп вроде подвисает.

Сегодня опять занялся изучением этой проблемы.  Оказывается проблема просто надумана  :shine:  Действительно с использованием MessageRequester возникают тормоза. Я думаю из-за того, что хук- это нечто такое, которое не должно останавливаться. А MessageRequester останавливает программу. Это конечно только мое мнение.
Я же хотел использовать хук для запуска одной программы из другой. А с этим нормально работает без тормозов :

hhook = SetWindowsHookEx_(#WH_MOUSE_LL, @zapusk5(),GetModuleHandle_(0),0)

И не надо никаких DLL   :crazyfun:

0

25

Петр!
У меня такой вопрос:
В 8 посте этого топа код.

HotKeyAdd(WindowID(#Window_0), 44, @CreateSkrinAll(), "SkrinAll", 0,0,1)

Как сделать динамически расширяющий список горячих клавиш? ведь там кроме этого кода используется процедура. То есть заранее неизвестны горячие клавишы и неизвестно имя запускаемой программы. Я написал код утили, которая сохраняет в файл клавиши и путь к файлу, он будет работать по надобности отдельным процессом:

Код:
Enumeration
  #Window_0
  #File
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Button_0   ; выбрать путь
  #String_0   ; Путь к файлу
  #String_1   ; клавишы
  #Button_1  ; принять
  #Button_2
EndEnumeration

 Global Bukva$
 
 If OpenFile(#File,"GOR.txt")
      While Eof(#File) = 0 
        Stroka.s=ReadString(#File)          
      Wend
 EndIf
 
Procedure Open_Window_0()
  If OpenWindow(#Window_0, 256, 207, 775, 114, "Горячие клавиши",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
    
      ButtonGadget(#Button_0, 745, 10, 25, 30, "")     
      StringGadget(#String_0, 15, 10, 720, 30, "")    ; путь к файлу
      StringGadget(#String_1, 270, 55, 230, 35, "")   ; клавиши
      ButtonGadget(#Button_1, 535, 60, 80, 25, "Принять")
      ButtonGadget(#Button_2, 20, 70, 130, 25, "Файл с клавишами")
      

  EndIf
EndProcedure



 Open_Window_0() ; открыли окно

Repeat 
ev=WaitWindowEvent()
Sleep_(1) 


For r=4 To 255 


          If GetAsyncKeyState_(#VK_SHIFT)=-32767 
              If sh=0       
               Bukva$="Shift+" 
               sh=1
               BukvaG$ +Bukva$
               SetGadgetText(#String_1, BukvaG$)
              EndIf 
          EndIf  
             
          If  GetAsyncKeyState_(#VK_MENU)=-32767 
              If al=0             
               Bukva$="Alt+"
               al=1
               BukvaG$+Bukva$
               SetGadgetText(#String_1, BukvaG$)
              EndIf 
          EndIf 
            
          If  GetAsyncKeyState_(#VK_CONTROL)=-32767 
              If ct=0
               Bukva$="Ctrl+" 
               ct=1
               BukvaG$ +Bukva$
               SetGadgetText(#String_1, BukvaG$)
              EndIf 
          EndIf 
          
          
          
        If bu=0
          If sh=1 Or al=1 Or ct=1
             If  GetAsyncKeyState_(r)=-32767
                   If r<>16 And r<>17 And r<>18 And r<>160 And r<>161 And r<>162 And r<>163 And r<>164 And r<>165
                     Bukva$=Chr(r)
                     BukvaG$+Bukva$
                     SetGadgetText(#String_1, BukvaG$)              
                     bu=1
                   EndIf 
             EndIf
          EndIf
        EndIf 
    
Next r 

If ev = #PB_Event_Gadget
        If EventGadget() =#Button_0
          Filename$ = OpenFileRequester("Выбрать файл", DefaultFile$, "EXE (*.exe)|*.exe", PatternPosition)
          SetGadgetText(#String_0, Filename$)
        EndIf
EndIf

If ev = #PB_Event_Gadget
        If EventGadget() =#Button_2
        If RunProgram("GOR.txt")    
        EndIf     
        EndIf
EndIf

If Filename$<>""
If bu=1
  If ev = #PB_Event_Gadget
        If EventGadget() = #Button_1
          WriteStringN(#File, Str(sh)+Str(al)+Str(ct)+Bukva$+Filename$)
          bu=0
          sh=0
          al=0
          ct=0
          Bukva$=""
          BukvaG$=""
          Filename$=""
          SetGadgetText(#String_1, "") 
          SetGadgetText(#String_0, "")
        EndIf
  EndIf
EndIf 
EndIf  

Until ev=#PB_Event_CloseWindow

CloseFile(#File)

А в другой, которая постоянно висит у меня в процессе, нужно считать из файла и сделать динамический рост горячих клавиш. Этот код считывания:

Код:
#file=1
If ReadFile(#File,"GOR.txt")
      While Eof(#File) = 0
         Stroka.s=ReadString(#File)  
          sh=Val(Mid(Stroka.s, 1, 1)) 
          al=Val(Mid(Stroka.s, 2, 1))
          ct=Val(Mid(Stroka.s, 3, 1)) 
          kl=Asc(Mid(Stroka.s,4,1)) 
  
      Wend
 EndIf

Пока только мыслишка: создать штук 20-30 процедур, у каждой своя переменная, в которую заносить пути для запуска при считывании файла. Так же и кода этого  HotKeyAdd(WindowID(#Window_0), 44, @CreateSkrinAll(), "SkrinAll", 0,0,1) накатать 20-30.
Может есть более рациональное решение?

0

26

haav написал(а):

Как сделать динамически расширяющий список горячих клавиш?

Ну, создаёшь с помощью оператора NewList список.

Код:
NewList MyList.l()

А потом работаешь с ним с помщью функций из раздела LinkedList справки.
Кое-что есть в конце этой странички http://pure-basic.narod.ru/docs/array_struct_list.html

haav написал(а):

Этот код считывания:

В начале проги создаёшь список

Код:
Structure HotKey
  sh.a
  al.a
  ct.a
  kl.a
EndStructure

NewList MyHotKey.HotKey()

А заполняешь так

Код:
#file=1
If ReadFile(#File,"GOR.txt")
      ClearList(MyHotKey()) 

      While Eof(#File) = 0
         AddElement(MyHotKey())
         Stroka.s=ReadString(#File)  
          MyHotKey()\sh=Val(Mid(Stroka.s, 1, 1)) 
          MyHotKey()\al=Val(Mid(Stroka.s, 2, 1))
          MyHotKey()\ct=Val(Mid(Stroka.s, 3, 1)) 
          MyHotKey()\kl=Asc(Mid(Stroka.s,4,1)) 
      Wend
 EndIf
haav написал(а):

Я написал код утили, которая сохраняет в файл клавиши и путь к файлу, он будет работать по надобности отдельным процессом:

А зачем цикл For - Next внутри главного цикла?
Тем боее в паре с WaitWindowEvent() да и Sleep_(1). То что ты задумал, работать не будет! Ну или замени хотябы WaitWindowEvent() на WindowEvent()
Посмотри как тормозит прорисовка окна.
Это нужно делать не в главном цикле, а по таймеру, скажем, каждые 100 мс.

0

27

С листами и структурами я работать умею. Как это связать с HotKeyAdd(WindowID(#Window_0), 44, @CreateSkrinAll(), "SkrinAll", 0,0,1)

Кроме того что с вызовом процедур делать?

Пётр написал(а):

А зачем цикл For - Next внутри главного цикла?Тем боее в паре с WaitWindowEvent() да и Sleep_(1). То что ты задумал, работать не будет! Ну или замени хотябы WaitWindowEvent() на WindowEvent()Посмотри как тормозит прорисовка окна.Это нужно делать не в главном цикле, а по таймеру, скажем, каждые 100 мс.

Это пересмотрю, хотя код и так работает. Я ведь лично для себя делаю.

0

28

haav написал(а):

Как это связать с HotKeyAdd(WindowID(#Window_0), 44, @CreateSkrinAll(), "SkrinAll", 0,0,1)

Ну вот так можно

Код:
#file=1
If ReadFile(#File,"GOR.txt")
      x=0
      While Eof(#File) = 0
         Stroka.s=ReadString(#File)  
          sh=Val(Mid(Stroka.s, 1, 1)) 
          al=Val(Mid(Stroka.s, 2, 1))
          ct=Val(Mid(Stroka.s, 3, 1)) 
          kl=Asc(Mid(Stroka.s,4,1)) 
          HotKeyAdd(WindowID(#Window_0), kl, @CreateSkrinAll(), "SkrinAll"+Str(x), sh,al,ct)
          x+1
      Wend
 EndIf

Как вариант, скопировать из друпии все функции, отвечающие за хуки и слегка переписать их. В частности, изменить функцию

Код:
ProcedureDLL HotkeyWaitWindowEvent() ; uses the waitwindowevent() function to check a hotkey msg
  message = WaitWindowEvent()
  result = message
  If HotKeysInitDone
    If message = #WM_HOTKEY
      wparam = EventwParam()
      If hotkeys(wparam)\name > ""
        CallFunctionFast(hotkeys(wparam)\func)
        result = HotkeyWaitWindowEvent()
      EndIf
    EndIf
  EndIf;initdone
  ProcedureReturn result
EndProcedure

так, чтобы wparam передавался нашей процедуре и тогда можно будет вычислить какое именно действие требуется сделать.
А обрабатывать все клавиши будет одна процедура.

0

29

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

0

30

Дорогой Петр!
Благодарю за ценный совет с друпией. Единственно я посчитал, что удобнее для хранения горячих клавиш в моем случае, все таки массив! Выставляю код того, что у меня получилось:

Код:
#file=1
#Window_0=2

Structure stru
sh.l
al.l
ct.l
kl.l
EndStructure

Global Dim klava.stru (50)   ; Здесь и ниже строчкой изменяя параметры в массивах, можно увеличить кол-во горячих клавиш
Global Dim PUT.s (50)          
Global nomer_mas
Global nomer_mas2
Global SELECTOR



;друпия 
Procedure Hot_KeysInit()
  Structure hotkeysinfo
    Id.l
    vk.l
    func.l
    name.s
    window.l
  EndStructure
  Global Dim hotkeys.hotkeysinfo(1000)
  Global HotKeysInitDone
  HotKeysInitDone = 1
EndProcedure
 


Procedure Hot_KeyAdd(Window, vk, function, Name.s, shiftstate, altstate, controlstate)
  Result = 0
  If vk And function And Name And Window And HotKeysInitDone
    idtouse = -1
    For x = 0 To 1000
      If hotkeys(x)\Name = ""
        hotkeys(x)\Name = Name
        hotkeys(x)\vk = vk
        hotkeys(x)\func = function
        hotkeys(x)\Id = x
        hotkeys(x)\Window = Window
        idtouse = x
        Break
      EndIf
    Next x
    
    mods = 0
    If shiftstate = 1
      mods = mods|#MOD_SHIFT
    EndIf
    If altstate = 1
      mods = mods|#MOD_ALT
    EndIf
    If controlstate = 1
      mods = mods|#MOD_CONTROL
    EndIf
    
    If idtouse > -1
      If RegisterHotKey_(Window, idtouse, mods, vk) = 0
      Else
        Result = 1
      EndIf
    Else
      Result = $DEAD
    EndIf
    
  Else
    Result = $DEADBEEF
  EndIf;check needed vars
  ProcedureReturn Result
EndProcedure  

Procedure Hotkey_WaitWindowEvent()
  message = WaitWindowEvent()
  result = message
  If HotKeysInitDone
    If message = #WM_HOTKEY
      wparam = EventwParam()
       SELECTOR=wparam
      If hotkeys(wparam)\name > ""
        CallFunctionFast(hotkeys(wparam)\func)
        result = Hotkey_WaitWindowEvent()
      EndIf
    EndIf
  EndIf;initdone
  ProcedureReturn result
EndProcedure



Hot_KeysInit()

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 600, 300, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
   
  EndIf
EndProcedure
Open_Window_0()

Procedure KLAVNYA()

 EnumProcessInit() 
Repeat 
  Temp.s=EnumProcess() 
  If LCase(Temp)=GetFilePart(PUT(SELECTOR))
    vpered=1
  EndIf 
Until Temp=""
If vpered<>1
RunProgram(PUT(SELECTOR))
EndIf
 

EndProcedure

If ReadFile(#File,"GOR.txt")
      While Eof(#File) = 0
         Stroka.s=ReadString(#File)  
         klava(nomer_mas)\sh=Val(Mid(Stroka.s, 1, 1)) 
         klava(nomer_mas)\al=Val(Mid(Stroka.s, 2, 1))
         klava(nomer_mas)\ct=Val(Mid(Stroka.s, 3, 1)) 
         klava(nomer_mas)\kl=Asc(Mid(Stroka.s,4,1)) 
         PUT(nomer_mas2)=Mid(Stroka.s,5)
         Hot_KeyAdd(WindowID(#Window_0), klava(nomer_mas)\kl, @KLAVNYA(), "lll"+Str(Na_me), klava(nomer_mas)\sh,klava(nomer_mas)\al,klava(nomer_mas)\ct)
         nomer_mas+1
         nomer_mas2+1
         Na_me+1
      Wend
 EndIf
 


Repeat
 Event=Hotkey_WaitWindowEvent()
Until Event=#PB_Event_CloseWindow

Теперь только осталось всунуть этот код в свою прогу   :)

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопрос по горячим клавишам