titulo auto-explicativo
modulo:
modulo:
#==============================================================================
# Módulo de Mouse - Masked
#
# Funções:
# * Mouse.position : Retorna a posição do mouse na janela no formato [x,y]
# * Mouse.X_trigger? : Verifica se o botão X do mouse foi clicado
# * Mouse.X_repeat? : Verifica se o botão X do mouse foi clicado e pressionado
# * Mouse.X_press? : Verifica se o botão X do mouse foi pressionado
# X deve ser right (para o botão direito) ou left (para o esquerdo)
#
#==============================================================================
#==============================================================================
# ** Mouse
#==============================================================================
module Mouse
#--------------------------------------------------------------------------
# > Funções do Win32API
#--------------------------------------------------------------------------
# Posição do cursor na tela
GetCursorPos = Win32API.new('user32', 'GetCursorPos', 'p', 'i')
# Handle da janela ativa
GetActiveWindow = Win32API.new('user32', 'GetActiveWindow', 'v', 'l')
# Cordenada da tela para o cliente (janela)
ScreenToClient = Win32API.new('user32', 'ScreenToClient', 'lp', 'i')
# Estado de tecla (cliques)
GetKeyState = Win32API.new('user32', 'GetAsyncKeyState', 'i', 'i')
#--------------------------------------------------------------------------
# > Códigos de tecla virtual
#--------------------------------------------------------------------------
VK_LBUTTON = 0x1 # Botão esquerdo do mouse
VK_RBUTTON = 0x2 # Botão direito do mouse
# Variáveis de classe
@@__trigger = []
@@__index = []
extend self
#--------------------------------------------------------------------------
# * Obtém a posição do mouse na janela
#--------------------------------------------------------------------------
def position
buffer = "\0" * 8
GetCursorPos.call(buffer)
hWnd = GetActiveWindow.call
ScreenToClient.call(hWnd, buffer)
point = buffer.unpack('S*')
return [point[0], point[2]]
end
#--------------------------------------------------------------------------
# ...
#--------------------------------------------------------------------------
def __press?(code)
return GetKeyState.call(code) != 0
end
private :__press?
#--------------------------------------------------------------------------
# * Verifica se o botão esquerdo está pressionado
#--------------------------------------------------------------------------
def left_press?
return __press?(VK_LBUTTON)
end
#--------------------------------------------------------------------------
# * Verifica se o botão direito está pressionado
#--------------------------------------------------------------------------
def right_press?
return __press?(VK_RBUTTON)
end
#--------------------------------------------------------------------------
# ...
#--------------------------------------------------------------------------
def __trigger?(code)
unless GetKeyState.call(code) == 0
@@__trigger.include?(code) ? (return false) : @@__trigger.push(code)
return true
else
@@__trigger.delete(code) if @@__trigger.include?(code)
return false
end
end
private :__trigger?
#--------------------------------------------------------------------------
# * Verifica se o botão esquerdo foi clicado
#--------------------------------------------------------------------------
def left_trigger?
return __trigger?(VK_LBUTTON)
end
#--------------------------------------------------------------------------
# * Verifica se o botão direito foi clicado
#--------------------------------------------------------------------------
def right_trigger?
return __trigger?(VK_RBUTTON)
end
#--------------------------------------------------------------------------
# ...
#--------------------------------------------------------------------------
def __repeat?(code)
unless GetKeyState.call(code) == 0
@@__trigger.push(code) unless @@__trigger.include?(code)
index = @@__trigger.index(code)
@@__index[index] = 0 unless @@__index[index]
@@__index[index] += 1
return true if @@__index[index] == 1
@@__index[index] >= 30 && @@__index[index] % 4 == 1 ? (return true) : (return false)
else
index = @@__trigger.index(code) if @@__trigger.include?(code)
@@__index[index] = nil if index
end
end
private :__repeat?
#--------------------------------------------------------------------------
# * Verifica se o botão esquerdo foi clicado e pressionado
#--------------------------------------------------------------------------
def left_repeat?
return __repeat?(VK_LBUTTON)
end
#--------------------------------------------------------------------------
# * Verifica se o botão direito foi clicado e pressionado
#--------------------------------------------------------------------------
def right_repeat?
return __repeat?(VK_RBUTTON)
end
end
# Módulo de Mouse - Masked
#
# Funções:
# * Mouse.position : Retorna a posição do mouse na janela no formato [x,y]
# * Mouse.X_trigger? : Verifica se o botão X do mouse foi clicado
# * Mouse.X_repeat? : Verifica se o botão X do mouse foi clicado e pressionado
# * Mouse.X_press? : Verifica se o botão X do mouse foi pressionado
# X deve ser right (para o botão direito) ou left (para o esquerdo)
#
#==============================================================================
#==============================================================================
# ** Mouse
#==============================================================================
module Mouse
#--------------------------------------------------------------------------
# > Funções do Win32API
#--------------------------------------------------------------------------
# Posição do cursor na tela
GetCursorPos = Win32API.new('user32', 'GetCursorPos', 'p', 'i')
# Handle da janela ativa
GetActiveWindow = Win32API.new('user32', 'GetActiveWindow', 'v', 'l')
# Cordenada da tela para o cliente (janela)
ScreenToClient = Win32API.new('user32', 'ScreenToClient', 'lp', 'i')
# Estado de tecla (cliques)
GetKeyState = Win32API.new('user32', 'GetAsyncKeyState', 'i', 'i')
#--------------------------------------------------------------------------
# > Códigos de tecla virtual
#--------------------------------------------------------------------------
VK_LBUTTON = 0x1 # Botão esquerdo do mouse
VK_RBUTTON = 0x2 # Botão direito do mouse
# Variáveis de classe
@@__trigger = []
@@__index = []
extend self
#--------------------------------------------------------------------------
# * Obtém a posição do mouse na janela
#--------------------------------------------------------------------------
def position
buffer = "\0" * 8
GetCursorPos.call(buffer)
hWnd = GetActiveWindow.call
ScreenToClient.call(hWnd, buffer)
point = buffer.unpack('S*')
return [point[0], point[2]]
end
#--------------------------------------------------------------------------
# ...
#--------------------------------------------------------------------------
def __press?(code)
return GetKeyState.call(code) != 0
end
private :__press?
#--------------------------------------------------------------------------
# * Verifica se o botão esquerdo está pressionado
#--------------------------------------------------------------------------
def left_press?
return __press?(VK_LBUTTON)
end
#--------------------------------------------------------------------------
# * Verifica se o botão direito está pressionado
#--------------------------------------------------------------------------
def right_press?
return __press?(VK_RBUTTON)
end
#--------------------------------------------------------------------------
# ...
#--------------------------------------------------------------------------
def __trigger?(code)
unless GetKeyState.call(code) == 0
@@__trigger.include?(code) ? (return false) : @@__trigger.push(code)
return true
else
@@__trigger.delete(code) if @@__trigger.include?(code)
return false
end
end
private :__trigger?
#--------------------------------------------------------------------------
# * Verifica se o botão esquerdo foi clicado
#--------------------------------------------------------------------------
def left_trigger?
return __trigger?(VK_LBUTTON)
end
#--------------------------------------------------------------------------
# * Verifica se o botão direito foi clicado
#--------------------------------------------------------------------------
def right_trigger?
return __trigger?(VK_RBUTTON)
end
#--------------------------------------------------------------------------
# ...
#--------------------------------------------------------------------------
def __repeat?(code)
unless GetKeyState.call(code) == 0
@@__trigger.push(code) unless @@__trigger.include?(code)
index = @@__trigger.index(code)
@@__index[index] = 0 unless @@__index[index]
@@__index[index] += 1
return true if @@__index[index] == 1
@@__index[index] >= 30 && @@__index[index] % 4 == 1 ? (return true) : (return false)
else
index = @@__trigger.index(code) if @@__trigger.include?(code)
@@__index[index] = nil if index
end
end
private :__repeat?
#--------------------------------------------------------------------------
# * Verifica se o botão esquerdo foi clicado e pressionado
#--------------------------------------------------------------------------
def left_repeat?
return __repeat?(VK_LBUTTON)
end
#--------------------------------------------------------------------------
# * Verifica se o botão direito foi clicado e pressionado
#--------------------------------------------------------------------------
def right_repeat?
return __repeat?(VK_RBUTTON)
end
end