2017-06-01 20 views
5

Để liên kết với phím tôi sử dụng:Ràng buộc với nhiều nút bấm

hs.hotkey.bind(hyper, '1' 

Làm thế nào để liên kết với nhiều máy ép của quan trọng? Một cái gì đó như:

hs.hotkey.bind(hyper, '1+1' 

Đọc the documentation, chức năng này không được đề cập.

Bằng nhiều lần nhấn, tôi có nghĩa là bấm 1 hai lần để chạy một số mã và bấm 1 ba lần để chạy một đoạn mã riêng biệt.

+0

Làm cách nào để bạn phân biệt giữa một và hai lần nhấn? – Li357

+0

@AndrewLi Tôi đã cập nhật câu hỏi, hy vọng điều này làm cho nó rõ ràng hơn –

+0

Chắc chắn nhưng làm thế nào máy tính sẽ phân biệt giữa 1 báo chí và ba lần nhấn? Làm thế nào để máy tính biết nếu tôi sẽ nhấn 1 một hoặc hai lần nữa? – Li357

Trả lời

0

Bạn sẽ phải tự thực hiện việc này. Dưới đây là một bản tóm tắt cơ bản về cách để thực hiện điều này:

  1. Bắt đầu hẹn giờ từ số không, và thiết lập một lá cờ cho báo chí đầu tiên ban đầu để sai, mà chỉ báo chí đầu tiên chưa xảy ra
  2. Quan sát và xem keypresses với hs.eventtap, cụ thể hs.eventtap.event.types.keyPress
  3. Khi sự kiện (keyPress) xảy ra, kiểm tra xem phím bấm là đúng key
  4. Nếu nó là chìa khóa đúng, kiểm tra xem đó là báo chí thứ hai và nếu nó được trong thời gian, nếu nó không đúng giờ hoặc không báo chí thứ hai sau đó thiết lập bộ đếm thời gian đến thời điểm hiện tại và lá cờ đầu tiên là true
  5. Nếu đó là báo chí thứ hai là trong thời gian, sau đó thực hiện xử lý của chúng tôi và đặt lại hẹn giờ và lá cờ đầu tiên
  6. Nếu nó không được phím phải sau đó đặt lại hẹn giờ và cờ đầu tiên

Được dịch thành mã, đây là những gì có thể trông giống như (Tôi không phải là chuyên gia Lua).Lưu ý rằng các cờ có thể được triển khai dưới dạng boolean tại đây hoặc dưới dạng bảng nội bộ giữ phím bấm cho đến thời điểm này bạn có thể kiểm tra:

local timer = require("hs.timer") 
local eventtap = require("hs.eventtap") 
local keycodes = require("hs.keycodes") 
local events = eventtap.event.types --all the event types 

timeFrame = 1 --this is the timeframe in which the second press should occur, in seconds 
key = 50 --the specific keycode we're detecting, in this case, 50 

--print(keycodes.map["`"]) you can look up the certain keycode by accessing the map 

function twoHandler() 
    hs.alert("Pressed ` twice!") --the handler for the double press 
end 

function correctKeyChecker(event) --keypress validator, checks if the keycode matches the key we're trying to detect 
    local keyCode = event:getKeyCode() 
    return keyCode == key --return if keyCode is key 
end 

function inTime(time) --checks if the second press was in time 
    return timer.secondsSinceEpoch() - time < timeFrame --if the time passed from the first press to the second was less than the timeframe, then it was in time 
end 

local pressTime, firstDown = 0, false --pressTime was the time the first press occurred which is set to 0, and firstDown indicates if the first press has occurred or not 

eventtap.new({ events.keyDown }, function(event) --watch the keyDown event, trigger the function every time there is a keydown 
    if correctKeyChecker(event) then --if correct key 
     if firstDown and inTime(pressTime) then --if first press already happened and the second was in time 
      twoHandler() --execute the handler 
     elseif not firstDown or inTime(pressTime) then --if the first press has not happened or the second wasn't in time 
      pressTime, firstDown = timer.secondsSinceEpoch(), true --set first press time to now and first press to true 
      return false --stop prematurely 
     end 
    end 
    pressTime, firstDown = 0, false --if it reaches here that means the double tap was successful or the key was incorrect, thus reset timer and flag 
    return false --keeps the event propogating 
end):start() --start our watcher 

Tôi đã nhận xét mã theo từng dòng để hiểu rõ hơn. Nếu bạn muốn phát hiện 3 hoặc 4 hoặc một số số N tùy ý khác, chỉ cần đặt cờ cho các lần nhấn N - 1 và thêm một vài lần kiểm tra, nhưng không có sự kết hợp quan trọng nào cần nhiều hơn 2 lần nhấn liên tiếp. Nó có vẻ hơi tiết, nhưng AFAIK đây là cách bạn làm điều đó. Để tránh mã trùng lặp và bản mẫu soạn sẵn, hãy thử đặt mã này trong cấu trúc giống lớp hoặc mô-đun để bạn có thể sử dụng lại mã.

Để thực hiện một trình xử lý khác nhau cho 2 lần nhấn liên tiếp, hoặc 3 lần nhấn liên tiếp, điều đó sẽ hơi khó hơn vì bạn sẽ phải đợi toàn bộ khung thời gian trước khi biết người dùng có bấm lại hay không. . Điều đó sẽ gây ra sự chậm trễ và trải nghiệm người dùng tồi, tôi khuyên bạn nên thực hiện điều đó bằng cách tái cấu trúc mã và thực hiện một số kiểm tra khác như đó là khung thời gian và cờ đầu tiên được kích hoạt, sau đó thực thi trình xử lý cho một lần nhấn.

0

Bạn không thể ràng buộc tất cả các khóa hoặc nhiều khóa bằng liên kết. Thay vào đó bạn có thể sử dụng chức năng này: http://www.hammerspoon.org/docs/hs.eventtap.html#keyStroke

Vì vậy, các ngôn ngữ lập trình phía trước cách tiếp cận thuyết bất khả tri thẳng nhất là như sau:

  1. Gọi chức năng của bạn cho bất kỳ đột quỵ quan trọng.
  2. Trong hàm giữ một biến mẫu tĩnh sẽ giữ các nét chính trước đó.
  3. Khi nhiệm vụ đầu tiên của hàm của bạn gắn thêm ký tự sắp tới mới vào biến đó.
  4. Kiểm tra 3 ký tự cuối cùng nếu chúng là chuỗi "11" mong muốn.

tắm cho điều kiện khắc nghiệt:

  1. Nếu chiều dài biến vượt qua một điểm nhất định giảm nó theo chiều dài 1 để nó không giữ vị trí không cần thiết trong bộ nhớ.
Các vấn đề liên quan