View Issue Details

IDProjectCategoryView StatusLast Update
0003557WishesMacropublic2024-05-01 22:21
ReporterJohnDoe Assigned To 
PrioritynormalSeverityminorReproducibilityN/A
Status closedResolutionfixed 
Platformx86OSWindowsOS VersionXP SP3
Fixed in Version3.0 
Summary0003557: mf.flock: исправить "капризность" функции
DescriptionИсторию вопроса можно найти в changelog
zg 05.11.2007 12:04:08 +0200 - build 323

В энциклопедии предложен хитрый код, призванный компенсировать несовершенство функции.

Однако, функцию элементарно усовершенствовать: если значение из GetKeyState (keyboard.cpp:384) показывает, что клавиша удерживается, то необходимо послать события в обратном порядке (отпускание, потом нажатие).
Steps To ReproduceИзменения минимальные, но поскольку C не владею, то вот Lua для демонстрации:

local ffi = require"ffi"
ffi.cdef[[
VOID keybd_event(
  BYTE      bVk,
  BYTE      bScan,
  DWORD     dwFlags,
  ULONG_PTR dwExtraInfo
);
]]
local C = ffi.C
local KEYEVENTF_EXTENDEDKEY = 0x1
local KEYEVENTF_KEYUP = 0x2
local function toggle(vkKey,ExKey)
  local keyDown,keyToggled = win.GetKeyState(vkKey)
  if keyDown then
    C.keybd_event(vkKey, 0, ExKey + KEYEVENTF_KEYUP, 0);
    C.keybd_event(vkKey, 0, ExKey, 0);
  else
    C.keybd_event(vkKey, 0, ExKey, 0);
    C.keybd_event(vkKey, 0, ExKey + KEYEVENTF_KEYUP, 0);
  end
end

local vk = far.NameToInputRecord"CapsLock".VirtualKeyCode

Macro { description="переключение между окнами";
  area="Common"; key="CtrlCapsLock";
  action=function()
    Keys("CtrlShiftTab")
    toggle(vk,KEYEVENTF_EXTENDEDKEY)
  end;
}
TagsNo tags attached.
Build6325

Issue History

Date Modified Username Field Change
2017-11-22 20:33 JohnDoe New Issue
2024-05-01 12:33 JohnDoe Note Added: 0017543
2024-05-01 22:21 JohnDoe Status new => closed
2024-05-01 22:21 JohnDoe Resolution open => fixed
2024-05-01 22:21 JohnDoe Fixed in Version => 3.0
2024-05-01 22:21 JohnDoe Build => 6325