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:
- 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
- Quan sát và xem keypresses với
hs.eventtap
, cụ thể hs.eventtap.event.types.keyPress
- Khi sự kiện (
keyPress
) xảy ra, kiểm tra xem phím bấm là đúng key
- 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
- Nếu đó là báo chí thứ hai và 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
- 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.
Làm cách nào để bạn phân biệt giữa một và hai lần nhấn? – Li357
@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 –
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