FreeBasic
Главная
Вход
Регистрация
Понедельник, 30.12.2024, 19:34Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
NumPadEnter
symarglДата: Воскресенье, 05.07.2015, 09:01 | Сообщение # 1
Сержант
Группа: Пользователи
Сообщений: 27
Репутация: 0
Статус: Offline
Как правый энтер отличить от основного? Как-то ведь можно, если очень хочется. В интернете есть один - и совершенно мне непонятный в принципе - пример для Delphi. А что надо сделать в нашем любимом FB ?
 
haavДата: Воскресенье, 05.07.2015, 12:16 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
На винде без проблем. В событии WM_KEYDOWN проверить 24 бит параметра LPARAM:

Код
#Include "windows.bi"

Dim Shared As Integer oldProc

Function newProc(hwnd As HWND, msg As UINT, wparam As LPARAM, lparam As WPARAM) As Integer
  If msg = WM_KEYDOWN Then
   if Bit(CInt(lparam),24) Then
    ? "Right ENTER"
   Else
    ? "Left ENTER"
   EndIf
  EndIf
  Return CallWindowProc(Cast(wndproc,oldProc),hwnd,msg,wparam,lparam)
End Function

Screen 11

Dim as Integer hw

ScreenControl(2,hw)

oldProc = SetWindowLong(Cast(hwnd,hw),GWL_WNDPROC,CInt(@newProc))
Do
  Sleep(1)
Loop Until MultiKey(1)


Как сделать на других системах не в курсе.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
symarglДата: Воскресенье, 05.07.2015, 14:05 | Сообщение # 3
Сержант
Группа: Пользователи
Сообщений: 27
Репутация: 0
Статус: Offline
Работает!!! Однако торможу, а как такое не на «чистом API», а на window9 осуществить?
 
haavДата: Воскресенье, 05.07.2015, 14:37 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Я не знаю , что ты в конце концов хочешь. С пустым окном (например окно и прямо на нем рисуешь) будет работать такой код:

Код
#Include "window9.bi"
Dim As Integer event
Dim as HWND hwnd
hwnd=OpenWindow("",10,10,500,500) : CenterWindow(hwnd)
Do  
  event=WaitEvent()
  Select Case event  
   Case EventKeyDown
    If EventKEY=&hd Then
     If Bit(CInt(EventLParam),24) Then
      ? "Right ENTER"
     Else
      ? "Left ENTER"
     EndIf
    EndIf
  End Select
  If Event=EventClose Then End
Loop


А если у окна будут гаджеты, то они (при клике по ним) будут отбирать себе фокус и тогда уже надо в оконной процедуре нужных гаджетов ловить WM_KEYDOWN. Может тебе нужно отлавливать ENTER глобально, тогда наверно лучше хук ставить (я не пробовал, но думаю там должно работать).


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
symarglДата: Воскресенье, 05.07.2015, 15:17 | Сообщение # 5
Сержант
Группа: Пользователи
Сообщений: 27
Репутация: 0
Статус: Offline
Пытаюсь сделать глобально посредством AddKeyboardShortcut(hwnd,FVIRTKEY,VK_RETURN...  Не получается sad
 
haavДата: Воскресенье, 05.07.2015, 16:41 | Сообщение # 6
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Ну если глобально, то так можно:

Код
#Include "window9.bi"

Dim As Integer event
Dim As HWND hwnd

Function windowproc(hwnd As HWND,msg As UINT,wParam As WPARAM,lParam As LPARAM) As Integer
  If msg = WM_KEYDOWN Then
   If wparam = &hd Then '  Сканкод "Enter" = &hd
    If Bit(CInt(lParam),24) Then ' проверяем 24 бит
     ? "Right ENTER"
    Else
     ? "Left ENTER"
    EndIf
   EndIf
  EndIf
  Return 0
End Function

hwnd=OpenWindow("",10,10,500,500) : CenterWindow(hwnd)
ButtonGadget(1,10,10,100,30,"Button")
SetWindowCallback(CInt(@windowproc),1)

Do
  event=WaitEvent()
  If Event=EventClose Then End
Loop


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
symarglДата: Воскресенье, 05.07.2015, 17:28 | Сообщение # 7
Сержант
Группа: Пользователи
Сообщений: 27
Репутация: 0
Статус: Offline
Превосходно, именно то, что требовалось. БлагоДарю!
 
  • Страница 1 из 1
  • 1
Поиск: