Kiểm tra trạng thái bàn phím
Hàm TerminalInfoInteger
có thể được sử dụng để tìm hiểu trạng thái của các phím điều khiển, còn được gọi là phím ảo. Những phím này bao gồm, cụ thể là Ctrl
, Alt
, Shift
, Enter
, Ins
, Del
, Esc
, các phím mũi tên, và nhiều phím khác. Chúng được gọi là phím ảo vì bàn phím, theo quy tắc, cung cấp nhiều cách để tạo ra cùng một hành động điều khiển. Ví dụ, Ctrl
, Shift
và Alt
được nhân đôi ở phía bên trái và bên phải của phím cách, trong khi con trỏ có thể được di chuyển cả bằng các phím chuyên dụng lẫn các phím chính khi nhấn phím Fn
. Do đó, hàm này không thể phân biệt giữa các phương pháp điều khiển ở mức vật lý (ví dụ, Shift
bên trái và bên phải).
API định nghĩa các hằng số cho các phím sau:
Định danh | Mô tả |
---|---|
TERMINAL_KEYSTATE_LEFT | Mũi tên trái |
TERMINAL_KEYSTATE_UP | Mũi tên lên |
TERMINAL_KEYSTATE_RIGHT | Mũi tên phải |
TERMINAL_KEYSTATE_DOWN | Mũi tên xuống |
TERMINAL_KEYSTATE_SHIFT | Shift |
TERMINAL_KEYSTATE_CONTROL | Ctrl |
TERMINAL_KEYSTATE_MENU | Windows |
TERMINAL_KEYSTATE_CAPSLOCK | CapsLock |
TERMINAL_KEYSTATE_NUMLOCK | NumLock |
TERMINAL_KEYSTATE_SCRLOCK | ScrollLock |
TERMINAL_KEYSTATE_ENTER | Enter |
TERMINAL_KEYSTATE_INSERT | Insert |
TERMINAL_KEYSTATE_DELETE | Delete |
TERMINAL_KEYSTATE_HOME | Home |
TERMINAL_KEYSTATE_END | End |
TERMINAL_KEYSTATE_TAB | Tab |
TERMINAL_KEYSTATE_PAGEUP | PageUp |
TERMINAL_KEYSTATE_PAGEDOWN | PageDown |
TERMINAL_KEYSTATE_ESCAPE | Escape |
Hàm này trả về một giá trị số nguyên hai byte báo cáo trạng thái hiện tại của phím được yêu cầu bằng cách sử dụng một cặp bit.
Bit ít ý nghĩa nhất theo dõi các lần nhấn phím kể từ lần gọi hàm cuối cùng. Ví dụ, nếu TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE)
trả về 0 tại một thời điểm nào đó, và sau đó người dùng nhấn Escape
, thì ở lần gọi tiếp theo, TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE)
sẽ trả về 1. Nếu phím được nhấn lại, giá trị sẽ trở về 0.
Đối với các phím chịu trách nhiệm chuyển đổi chế độ nhập liệu, chẳng hạn như CapsLock
, NumLock
và ScrollLock
, vị trí của bit cho biết liệu chế độ tương ứng được bật hay tắt.
Bit quan trọng nhất của byte thứ hai (0x8000) được đặt nếu phím đang được nhấn (và chưa được thả) tại thời điểm hiện tại.
Tính năng này không thể được sử dụng để theo dõi việc nhấn các phím chữ cái, số và phím chức năng. Để làm điều này, cần triển khai trình xử lý OnChartEvent và chặn các thông điệp với mã CHARTEVENT_KEYDOWN trong chương trình. Lưu ý rằng các sự kiện được tạo trên biểu đồ và chỉ khả dụng cho Expert Advisors và chỉ báo. Các chương trình loại khác (script và dịch vụ) không hỗ trợ mô hình lập trình sự kiện.
Script EnvKeys.mq5
bao gồm một vòng lặp qua tất cả các hằng số TERMINAL_KEYSTATE:
void OnStart()
{
for(ENUM_TERMINAL_INFO_INTEGER i = TERMINAL_KEYSTATE_TAB;
i <= TERMINAL_KEYSTATE_SCRLOCK; ++i)
{
const string e = EnumToString(i);
// bỏ qua các giá trị không phải là phần tử enum
if(StringFind(e, "ENUM_TERMINAL_INFO_INTEGER") == 0) continue;
PrintFormat("%s=%4X", e, (ushort)TerminalInfoInteger(i));
}
}
2
3
4
5
6
7
8
9
10
11
Bạn có thể thử nghiệm với các lần nhấn phím và bật/tắt chế độ bàn phím để xem các giá trị thay đổi như thế nào trong nhật ký.
Ví dụ, nếu chế độ in hoa bị tắt theo mặc định, chúng ta sẽ thấy nhật ký sau:
TERMINAL_KEYSTATE_SCRLOCK= 0
Nếu chúng ta nhấn phím ScrollLock và, không thả nó ra, chạy lại script, chúng ta sẽ nhận được nhật ký sau:
TERMINAL_KEYSTATE_CAPSLOCK=8001
Điều này có nghĩa là chế độ đã được bật và phím đang được nhấn. Hãy thả phím ra, và lần tiếp theo script sẽ trả về:
TERMINAL_KEYSTATE_SCRLOCK= 1
Chế độ vẫn được bật, nhưng phím đã được thả.
TerminalInfoInteger
không phù hợp để kiểm tra trạng thái của các phím (TERMINAL_KEYSTATE_XYZ) trong các chỉ báo phụ thuộc được tạo bởi lời gọi iCustom hoặc IndicatorCreate. Trong chúng, hàm luôn trả về 0, ngay cả khi chỉ báo được thêm vào biểu đồ bằng ChartIndicatorAdd`.
Ngoài ra, hàm này không hoạt động khi biểu đồ chương trình MQL không hoạt động (người dùng đã chuyển sang biểu đồ khác). MQL5 không cung cấp phương tiện để kiểm soát bàn phím liên tục.