【发布时间】:2023-03-14 11:54:01
【问题描述】:
我正在尝试做这样的事情,但只能使用鼠标:
require 'win32api'
BlockInput = Win32API.new("user32", "BlockInput", ["I"], "I")
BlockInput.call(1)
sleep 5
BlockInput.call(0)
我正在尝试使用SetWindowsHookEx,但它说可以工作但没有任何反应,我可以继续移动并单击鼠标,这是代码:
require 'win32/api'
# SetWindowsHookEx CONSTANTS
WH_MOUSE = 7
WH_MOUSE_LL = 14
# MouseProc or LowLevelMouseProc CONSTANTS
WM_MOUSEMOVE = 0x0200
WM_LBUTTONDOWN = 0x0201
WM_LBUTTONUP = 0x0202
WM_MOUSEWHEEL = 0x020A
WM_MOUSEHWHEEL = 0x020E
WM_RBUTTONDOWN = 0x0204
WM_RBUTTONUP = 0x0205
SetWindowsHookEx = Win32::API.new('SetWindowsHookEx', ['I', 'K', 'L', 'I'], 'L', 'user32')
CallNextHookEx = Win32::API.new('CallNextHookEx', ['I', 'I', 'L', 'P'], 'I', 'user32')
UnhookWindowsHookEx = Win32::API.new('UnhookWindowsHookEx', ['I'], 'I', 'user32')
GetCurrentThreadId = Win32::API.new('GetCurrentThreadId', ['V'], 'I', 'kernel32')
MouseProc = Win32::API::Callback.new('ILP', 'L') do |nCode, wParam, lParam|
# https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/ms644988(v=vs.85)
if nCode < 0 # If nCode is less than zero, the hook procedure must return the value returned by CallNextHookEx.
return CallNextHookEx.call(0, nCode, wParam, lParam)
elsif wParam == WM_MOUSEMOVE or wParam == WM_LBUTTONDOWN or wParam == WM_LBUTTONUP
# If the hook procedure processed the message, it may return a nonzero value to prevent the system from
# passing the message to the rest of the hook chain or the target window procedure.
return 1
else
# If nCode is greater than or equal to zero, and the hook procedure did not process the message,
# it is highly recommended that you call CallNextHookEx and return the value it returns;
# otherwise, other applications that have installed WH_MOUSE_LL hooks will not receive hook
# notifications and may behave incorrectly as a result.
return CallNextHookEx.call(0, nCode, wParam, lParam)
end
end
threadID = GetCurrentThreadId.call
hMod = nil
# If the function succeeds, the return value is the handle to the hook procedure.
p hhk = SetWindowsHookEx.call(WH_MOUSE, MouseProc, hMod, threadID) #=> 166134929 (Good)
# But nothing happens, i can continue moving and clicking my mouse.
sleep 5
p UnhookWindowsHookEx.call(hhk) #=> 1 (Good)
如果有人知道如何做或如何以其他方式做,我将不胜感激。
编辑:我在 Windows 7(32 位)上以管理员权限运行代码
我正在尝试在Strive Sun - MSFT 的回答之后使用 GetMessage(),但我在传递 MSG 指针时遇到了一些问题
GetMessage = Win32::API.new('GetMessage', ['P', 'L', 'L', 'L'], 'I', 'user32')
point = [0, 0].pack('LL')
hwnd = uint = wparam = lparam = dword = 0
buf = [hwnd, uint, wparam, lparam, dword, point, dword].pack('JIL2Sa8S')
# J > hwnd, I > uint, L2 > wparam lparam, S > dword, a8 > point
GetMessage.call(buf, nil, 0, 0) #=> Stuck, i need to use Manager Task to close it.
【问题讨论】: