Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eleкtro

#6461
un último repaso definitivo a esta Class, para fijar un pequeño problema con las coordenadas.

Código (vbnet) [Seleccionar]
' ***********************************************************************
' Author           : Elektro
' Last Modified On : 09-26-2014
' ***********************************************************************
' <copyright file="MouseHook.vb" company="Elektro Studios">
'     Copyright (c) Elektro Studios. All rights reserved.
' </copyright>
' ***********************************************************************

#Region " Instructions "

' Go to page:
' Project > Properties > Debug
'
' Then uncheck the option:
' "Enable the Visual Studio Hosting Process"

#End Region

#Region " Usage Examples "

#End Region

#Region " Imports "

Imports System.ComponentModel
Imports System.Reflection
Imports System.Runtime.InteropServices

#End Region

#Region " MouseHook "

''' <summary>
''' A low level mouse hook that processes mouse input events.
''' </summary>
Friend NotInheritable Class MouseHook : Implements IDisposable

#Region " P/Invoke "

    ''' <summary>
    ''' Platform Invocation methods (P/Invoke), access unmanaged code.
    ''' This class does not suppress stack walks for unmanaged code permission.
    ''' <see cref="System.Security.SuppressUnmanagedCodeSecurityAttribute"/>  must not be applied to this class.
    ''' This class is for methods that can be used anywhere because a stack walk will be performed.
    ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/ms182161.aspx
    ''' </summary>
    Protected NotInheritable Class NativeMethods

#Region " Methods "

        ''' <summary>
        ''' Passes the hook information to the next hook procedure in the current hook chain.
        ''' A hook procedure can call this function either before or after processing the hook information.
        ''' For more info see here:
        ''' http://msdn.microsoft.com/en-us/library/windows/desktop/ms644974%28v=vs.85%29.aspx
        ''' </summary>
        ''' <param name="idHook">
        ''' This parameter is ignored.
        ''' </param>
        ''' <param name="nCode">
        ''' The hook code passed to the current hook procedure.
        ''' The next hook procedure uses this code to determine how to process the hook information.
        ''' </param>
        ''' <param name="wParam">
        ''' The wParam value passed to the current hook procedure.
        ''' The meaning of this parameter depends on the type of hook associated with the current hook chain.
        ''' </param>
        ''' <param name="lParam">
        ''' The lParam value passed to the current hook procedure.
        ''' The meaning of this parameter depends on the type of hook associated with the current hook chain.
        ''' </param>
        ''' <returns>
        ''' This value is returned by the next hook procedure in the chain.
        ''' The current hook procedure must also return this value.
        ''' The meaning of the return value depends on the hook type.
        ''' For more information, see the descriptions of the individual hook procedures.
        ''' </returns>
        <DllImport("user32.dll", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Auto)>
        Friend Shared Function CallNextHookEx(
               ByVal idHook As IntPtr,
               ByVal nCode As Integer,
               ByVal wParam As IntPtr,
               ByVal lParam As IntPtr
        ) As IntPtr
        End Function

        ''' <summary>
        ''' Installs an application-defined hook procedure into a hook chain.
        ''' You would install a hook procedure to monitor the system for certain types of events.
        ''' These events are associated either with a specific thread
        ''' or with all threads in the same desktop as the calling thread.
        ''' For more info see here:
        ''' http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx
        ''' </summary>
        ''' <param name="idHook">
        ''' The type of hook procedure to be installed.
        ''' </param>
        ''' <param name="lpfn">
        ''' A pointer to the hook procedure.
        ''' If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process,
        ''' the lpfn parameter must point to a hook procedure in a DLL.
        ''' Otherwise, lpfn can point to a hook procedure in the code associated with the current process.
        ''' </param>
        ''' <param name="hInstance">
        ''' A handle to the DLL containing the hook procedure pointed to by the lpfn parameter.
        ''' The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by
        ''' the current process and if the hook procedure is within the code associated with the current process.
        ''' </param>
        ''' <param name="threadId">
        ''' The identifier of the thread with which the hook procedure is to be associated.
        ''' For desktop apps, if this parameter is zero, the hook procedure is associated
        ''' with all existing threads running in the same desktop as the calling thread.
        ''' </param>
        ''' <returns>
        ''' If the function succeeds, the return value is the handle to the hook procedure.
        ''' If the function fails, the return value is NULL.
        ''' </returns>
        <DllImport("user32.dll", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Auto)>
        Friend Shared Function SetWindowsHookEx(
               ByVal idHook As HookType,
               ByVal lpfn As LowLevelMouseProcDelegate,
               ByVal hInstance As IntPtr,
               ByVal threadId As UInteger
        ) As IntPtr
        End Function

        ''' <summary>
        ''' Removes a hook procedure installed in a hook chain by the 'SetWindowsHookEx' function.
        ''' For more info see here:
        ''' http://msdn.microsoft.com/en-us/library/windows/desktop/ms644993%28v=vs.85%29.aspx
        ''' </summary>
        ''' <param name="idHook">
        ''' A handle to the hook to be removed.
        ''' This parameter is a hook handle obtained by a previous call to SetWindowsHookEx.
        ''' </param>
        ''' <returns>
        ''' If the function succeeds, the return value is nonzero.
        ''' If the function fails, the return value is zero.
        ''' </returns>
        <DllImport("user32.dll", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Auto)>
        Friend Shared Function UnhookWindowsHookEx(
               ByVal idHook As IntPtr
        ) As Boolean
        End Function

        ''' <summary>
        ''' Retrieves the current double-click time for the mouse.
        ''' A double-click is a series of two clicks of the mouse button,
        ''' the second occurring within a specified time after the first.
        ''' The double-click time is the maximum number of milliseconds that may occur
        ''' between the first and second click of a double-click.
        ''' The maximum double-click time is 5000 milliseconds.
        ''' </summary>
        ''' <returns>
        ''' The return value specifies the current double-click time, in milliseconds.
        ''' The maximum return value is 5000 milliseconds.
        ''' </returns>
        <DllImport("user32.dll", CharSet:=CharSet.Auto)>
        Friend Shared Function GetDoubleClickTime() As Integer
        End Function

#End Region

#Region " Enumerations "

        ''' <summary>
        ''' Indicates a type of Hook procedure to be installed.
        ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx
        ''' </summary>
        <Description("Enum used in 'idHook' parameter of 'SetWindowsHookEx' function.")>
        Friend Enum HookType As UInteger

            ' **************************************
            ' This enumeration is partially defined.
            ' **************************************

            ''' <summary>
            ''' Installs a hook procedure that monitors low-level mouse input events.
            ''' For more information, see the LowLevelMouseProc hook procedure.
            ''' </summary>
            WH_MOUSE_LL = 14UI

        End Enum

        ''' <summary>
        ''' The event-injected flags.
        ''' An application can use the following values to test the flags.
        ''' Testing LLMHF_INJECTED (bit 0) will tell you whether the event was injected.
        ''' If it was, then testing LLMHF_LOWER_IL_INJECTED (bit 1) will tell you
        ''' whether or not the event was injected from a process running at lower integrity level.
        ''' </summary>
        <Flags()>
        <Description("Enum used in 'flags' parameter of 'MSLLHOOKSTRUCT' structure.")>
        Public Enum MSLLHOOKSTRUCTFlags As Integer

            ''' <summary>
            ''' Test the event-injected (from any process) flag.
            ''' </summary>
            LLMHF_INJECTED = 1

            ''' <summary>
            ''' Test the event-injected (from a process running at lower integrity level) flag.
            ''' </summary>
            LLMHF_LOWER_IL_INJECTED = 2

        End Enum

#End Region

#Region " Structures "

        ''' <summary>
        ''' The POINT structure defines the x- and y- coordinates of a point.
        ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/dd162805%28v=vs.85%29.aspx
        ''' </summary>
        <Description("Structure used in 'pt' parameter of 'MSLLHOOKSTRUCT' structure.")>
        <StructLayout(LayoutKind.Sequential)>
        Friend Structure POINT

            ''' <summary>
            ''' The x-coordinate of the point.
            ''' </summary>
            Public X As Integer

            ''' <summary>
            ''' The y-coordinate of the point.
            ''' </summary>
            Public Y As Integer

        End Structure

        ''' <summary>
        ''' Contains information about a low-level mouse input event.
        ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644970%28v=vs.85%29.aspx
        ''' </summary>
        <Description("Structure used in 'lParam' parameter of 'CallNextHookEx' function.")>
        Friend Structure MSLLHOOKSTRUCT

            ''' <summary>
            ''' The ptThe x- and y-coordinates of the cursor, in screen coordinates.
            ''' </summary>
            Friend pt As NativeMethods.POINT

            ''' <summary>
            ''' If the message is 'WM_MOUSEWHEEL', the high-order word of this member is the wheel delta.
            ''' The low-order word is reserved.
            ''' A positive value indicates that the wheel was rotated forward, away from the user;
            ''' a negative value indicates that the wheel was rotated backward, toward the user.
            ''' One wheel click is defined as 'WHEEL_DELTA', which is '120'.
            ''' </summary>
            Friend mouseData As Integer

            ''' <summary>
            ''' The event-injected flag.
            ''' </summary>
            Friend flags As MSLLHOOKSTRUCTFlags

            ''' <summary>
            ''' The time stamp for this message.
            ''' </summary>
            Friend time As UInteger

            ''' <summary>
            ''' Additional information associated with the message.
            ''' </summary>
            Friend dwExtraInfo As IntPtr

        End Structure

#End Region

#Region " Delegates "

        ''' <summary>
        ''' Delegate LowLevelMouseProc
        ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644986%28v=vs.85%29.aspx
        ''' </summary>
        ''' <returns>
        ''' If nCode is less than zero, the hook procedure must return the value returned by CallNextHookEx.
        ''' 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.
        ''' 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.
        ''' </returns>
        Friend Delegate Function LowLevelMouseProcDelegate(
                ByVal nCode As IntPtr,
                ByVal wParam As IntPtr,
                ByVal lParam As IntPtr
        ) As Integer

#End Region

#Region " Hidden Methods "

        ''' <summary>
        ''' Determines whether the specified System.Object instances are considered equal.
        ''' </summary>
        <EditorBrowsable(EditorBrowsableState.Never)>
        Public Shadows Sub Equals()
        End Sub

        ''' <summary>
        ''' Determines whether the specified System.Object instances are the same instance.
        ''' </summary>
        <EditorBrowsable(EditorBrowsableState.Never)>
        Private Shadows Sub ReferenceEquals()
        End Sub

#End Region

    End Class

#End Region

#Region " Objects "

    ''' <summary>
    ''' Handle to the hook procedure.
    ''' </summary>
    Private MouseHook As IntPtr

    ''' <summary>
    ''' The mouse hook delegate.
    ''' </summary>
    Private MouseHookDelegate As NativeMethods.LowLevelMouseProcDelegate

#End Region

#Region " Properties "

    ''' <summary>
    ''' ** ONLY FOR TESTING PURPOSES **
    ''' Gets or sets a value indicating whether to suppress the last MouseUp event of
    ''' the specified clicked button when a double-click fires.
    '''
    ''' If this value is set to <c>true</c>, the application will send the events in this order for a Double-Click:
    ''' MouseDown, MouseUp, MouseDown, MouseDoubleClick
    '''
    ''' If this value is set to <c>false</c>, the application will send the events in this order for a Double-Click:
    ''' MouseDown, MouseUp, MouseDown, MouseUp, MouseDoubleClick
    '''
    ''' </summary>
    ''' <value><c>true</c> if MouseUp event is suppressed; otherwise <c>false</c>.</value>
    Friend Property SuppressMouseUpEventWhenDoubleClick As Boolean = False

#End Region

#Region " Enumerations "

    ''' <summary>
    ''' Indicates a Windows Message related to a mouse events.
    ''' For more info see here:
    ''' http://msdn.microsoft.com/en-us/library/windows/desktop/ff468877%28v=vs.85%29.aspx
    ''' </summary>
    Private Enum MouseMessages As UInteger

        ''' <summary>
        ''' Posted to a window when the cursor moves.
        ''' If the mouse is not captured, the message is posted to the window that contains the cursor.
        ''' Otherwise, the message is posted to the window that has captured the mouse
        ''' </summary>
        WM_MOUSEMOVE = &H200UI

        ''' <summary>
        ''' Posted when the user presses the left mouse button while the cursor is in the client area of a window.
        ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
        ''' Otherwise, the message is posted to the window that has captured the mouse
        ''' </summary>
        WM_LBUTTONDOWN = &H201UI

        ''' <summary>
        ''' Posted when the user releases the left mouse button while the cursor is in the client area of a window.
        ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
        ''' Otherwise, the message is posted to the window that has captured the mouse
        ''' </summary>
        WM_LBUTTONUP = &H202UI

        ''' <summary>
        ''' Posted when the user presses the right mouse button while the cursor is in the client area of a window.
        ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
        ''' Otherwise, the message is posted to the window that has captured the mouse
        ''' </summary>
        WM_RBUTTONDOWN = &H204UI

        ''' <summary>
        ''' Posted when the user releases the right mouse button while the cursor is in the client area of a window.
        ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
        ''' Otherwise, the message is posted to the window that has captured the mouse
        ''' </summary>
        WM_RBUTTONUP = &H205UI

        ''' <summary>
        ''' Posted when the user presses the middle mouse button while the cursor is in the client area of a window.
        ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
        ''' Otherwise, the message is posted to the window that has captured the mouse
        ''' </summary>
        WM_MBUTTONDOWN = &H207UI

        ''' <summary>
        ''' Posted when the user releases the middle mouse button while the cursor is in the client area of a window.
        ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
        ''' Otherwise, the message is posted to the window that has captured the mouse
        ''' </summary>
        WM_MBUTTONUP = &H208UI

        ''' <summary>
        ''' Sent to the active window when the mouse's horizontal scroll wheel is tilted or rotated.
        ''' The DefWindowProc function propagates the message to the window's parent.
        ''' There should be no internal forwarding of the message,
        ''' since DefWindowProc propagates it up the parent chain until it finds a window that processes it.
        ''' </summary>
        WM_MOUSEWHEEL = &H20AUI

    End Enum

    ''' <summary>
    ''' Indicates the whell direction of the mouse.
    ''' </summary>
    Public Enum WheelDirection As Integer

        ''' <summary>
        ''' The wheel is moved up.
        ''' </summary>
        WheelUp = 1

        ''' <summary>
        ''' The wheel is moved down.
        ''' </summary>
        WheelDown = 2

    End Enum

#End Region

#Region " Events "

    ''' <summary>
    ''' Occurs when the mouse moves.
    ''' </summary>
    Friend Event MouseMove(ByVal sender As Object,
                           ByVal MouseLocation As Point)

    ''' <summary>
    ''' Occurs when the mouse left button is pressed.
    ''' </summary>
    Friend Event MouseLeftDown(ByVal sender As Object,
                               ByVal MouseLocation As Point)

    ''' <summary>
    ''' Occurs when the mouse left button is released.
    ''' </summary>
    Friend Event MouseLeftUp(ByVal sender As Object,
                             ByVal MouseLocation As Point)

    ''' <summary>
    ''' Occurs when the mouse left button performs a double-click.
    ''' A double click is considered as: (MouseLeftDown + MouseLeftUp) * 2
    ''' </summary>
    Friend Event MouseLeftDoubleClick(ByVal sender As Object,
                                      ByVal MouseLocation As Point)

    ''' <summary>
    ''' Occurs when the mouse right button is pressed.
    ''' </summary>
    Friend Event MouseRightDown(ByVal sender As Object,
                                ByVal MouseLocation As Point)

    ''' <summary>
    ''' Occurs when the mouse right button is released.
    ''' </summary>
    Friend Event MouseRightUp(ByVal sender As Object,
                              ByVal MouseLocation As Point)

    ''' <summary>
    ''' Occurs when the mouse right button performs a double-click.
    ''' A double click is considered as: (MouseLeftDown + MouseLeftUp) * 2
    ''' </summary>
    Friend Event MouseRightDoubleClick(ByVal sender As Object,
                                       ByVal MouseLocation As Point)

    ''' <summary>
    ''' Occurs when the mouse middle button is pressed.
    ''' </summary>
    Friend Event MouseMiddleDown(ByVal sender As Object,
                                 ByVal MouseLocation As Point)

    ''' <summary>
    ''' Occurs when the mouse middle button is released.
    ''' </summary>
    Friend Event MouseMiddleUp(ByVal sender As Object,
                               ByVal MouseLocation As Point)

    ''' <summary>
    ''' Occurs when the mouse middle button performs a double-click.
    ''' A double click is considered as: (MouseLeftDown + MouseLeftUp) * 2
    ''' </summary>
    Friend Event MouseMiddleDoubleClick(ByVal sender As Object,
                                        ByVal MouseLocation As Point)

    ''' <summary>
    ''' Occurs when the mouse wheel is moved up or down.
    ''' </summary>
    Friend Event MouseWheel(ByVal sender As Object,
                            ByVal MouseLocation As Point,
                            ByVal WheelDirection As WheelDirection)

#End Region

#Region " Constructors "

    ''' <summary>
    ''' Prevents a default instance of the <see cref="MouseHook"/> class from being created.
    ''' </summary>
    Private Sub New()
    End Sub

    ''' <summary>
    ''' Initializes a new instance of the <see cref="MouseHook"/> class.
    ''' </summary>
    ''' <param name="Install">
    ''' If set to <c>true</c>, the Hook starts initialized for this <see cref="MouseHook"/> instance.
    ''' </param>
    Friend Sub New(Optional ByVal Install As Boolean = False)

        If Install Then
            Me.Install()
        End If

    End Sub

#End Region

#Region " Public Methods "

    ''' <summary>
    ''' Installs the Mouse Hook, then start processing messages to fire events.
    ''' </summary>
    Friend Sub Install()

        Me.MouseHookDelegate = New NativeMethods.LowLevelMouseProcDelegate(AddressOf LowLevelMouseProc)

        Try
            Me.MouseHook = NativeMethods.SetWindowsHookEx(NativeMethods.HookType.WH_MOUSE_LL,
                                                          Me.MouseHookDelegate,
                                                          Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly.GetModules()(0)).ToInt32, 0)

        Catch ex As Exception
            Throw

        End Try

    End Sub

    ''' <summary>
    ''' Uninstalls the Mouse Hook and free all resources, then stop processing messages to fire events.
    ''' </summary>
    Friend Sub Uninstall()

        Me.Finalize()

    End Sub

#End Region

#Region " Private Methods "

    ''' <summary>
    ''' Processes the mouse windows messages and raises it's corresponding events.
    ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644986%28v=vs.85%29.aspx
    ''' </summary>
    ''' <param name="nCode">
    ''' A code the hook procedure uses to determine how to process the message.
    ''' If nCode is less than zero, the hook procedure must pass the message to the CallNextHookEx function
    ''' without further processing and should return the value returned by CallNextHookEx.
    ''' </param>
    ''' <param name="wParam">The identifier of the mouse message.</param>
    ''' <param name="lParam"> A pointer to an <see cref="NativeMethods.MSLLHOOKSTRUCT"/> structure.</param>
    ''' <returns>
    ''' If nCode is less than zero, the hook procedure must return the value returned by CallNextHookEx.
    ''' 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.
    ''' 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.
    ''' </returns>
    Private Function LowLevelMouseProc(ByVal nCode As Integer,
                                       ByVal wParam As MouseMessages,
                                       ByVal lParam As IntPtr) As Integer

        Static LeftClickTime As Integer = 0I ' Determines a left button double-click.
        Static RightClickTime As Integer = 0I ' Determines a right button double-click.
        Static MiddleClickTime As Integer = 0I ' Determines a middle button double-click.

        If nCode = 0I Then

            Dim x As Integer
            Dim y As Integer

            Dim MouseStruct As NativeMethods.MSLLHOOKSTRUCT
            MouseStruct = CType(Marshal.PtrToStructure(lParam, MouseStruct.GetType()),
                                NativeMethods.MSLLHOOKSTRUCT)

            ' Fix X coordinate.
            Select Case MouseStruct.pt.X

                Case Is < 0I
                    x = 0I

                Case Is > SystemInformation.VirtualScreen.Width
                    x = SystemInformation.VirtualScreen.Width

                Case Else
                    x = MouseStruct.pt.X

            End Select

            ' Fix Y coordinate.
            Select Case MouseStruct.pt.Y

                Case Is > SystemInformation.VirtualScreen.Height
                    y = SystemInformation.VirtualScreen.Height

                Case Is < 0I
                    y = 0I

                Case Else
                    y = MouseStruct.pt.Y

            End Select

            Select Case wParam

                Case MouseMessages.WM_MOUSEMOVE
                    RaiseEvent MouseMove(Me, New Point(x, y))

                Case MouseMessages.WM_LBUTTONDOWN
                    RaiseEvent MouseLeftDown(Me, New Point(x, y))

                Case MouseMessages.WM_LBUTTONUP
                    If LeftClickTime <> 0 Then
                        LeftClickTime = Environment.TickCount() - LeftClickTime
                    End If

                    If (LeftClickTime <> 0) AndAlso (LeftClickTime < NativeMethods.GetDoubleClickTime()) Then
                        LeftClickTime = 0
                        If Not Me.SuppressMouseUpEventWhenDoubleClick Then
                            RaiseEvent MouseLeftUp(Me, New Point(x, y))
                        End If
                        RaiseEvent MouseLeftDoubleClick(Me, New Point(x, y))

                    Else
                        LeftClickTime = Environment.TickCount()
                        RaiseEvent MouseLeftUp(Me, New Point(x, y))

                    End If

                Case MouseMessages.WM_RBUTTONDOWN
                    RaiseEvent MouseRightDown(Me, New Point(x, y))

                Case MouseMessages.WM_RBUTTONUP
                    If RightClickTime <> 0 Then
                        RightClickTime = Environment.TickCount() - RightClickTime
                    End If

                    If (RightClickTime <> 0) AndAlso (RightClickTime < NativeMethods.GetDoubleClickTime()) Then
                        RightClickTime = 0
                        If Not Me.SuppressMouseUpEventWhenDoubleClick Then
                            RaiseEvent MouseRightUp(Me, New Point(x, y))
                        End If
                        RaiseEvent MouseRightDoubleClick(Me, New Point(x, y))

                    Else
                        RightClickTime = Environment.TickCount()
                        RaiseEvent MouseRightUp(Me, New Point(x, y))

                    End If

                Case MouseMessages.WM_MBUTTONDOWN
                    RaiseEvent MouseMiddleDown(Me, New Point(x, y))

                Case MouseMessages.WM_MBUTTONUP
                    If MiddleClickTime <> 0 Then
                        MiddleClickTime = Environment.TickCount() - MiddleClickTime
                    End If

                    If (MiddleClickTime <> 0) AndAlso (MiddleClickTime < NativeMethods.GetDoubleClickTime()) Then
                        MiddleClickTime = 0
                        If Not Me.SuppressMouseUpEventWhenDoubleClick Then
                            RaiseEvent MouseMiddleUp(Me, New Point(x, y))
                        End If
                        RaiseEvent MouseMiddleDoubleClick(Me, New Point(x, y))

                    Else
                        MiddleClickTime = Environment.TickCount()
                        RaiseEvent MouseMiddleUp(Me, New Point(x, y))

                    End If

                Case MouseMessages.WM_MOUSEWHEEL
                    RaiseEvent MouseWheel(Me, New Point(x, y), If(MouseStruct.mouseData < 0,
                                                                 WheelDirection.WheelDown,
                                                                 WheelDirection.WheelUp))

                Case Else
                    Exit Select ' Do Nothing

            End Select

            Return 0

        ElseIf nCode < 0I Then
            Return NativeMethods.CallNextHookEx(MouseHook, nCode, wParam, lParam)

        Else ' nCode > 0
            Return -1I

        End If

    End Function

#End Region

#Region " Hidden Methods "

    ''' <summary>
    ''' Serves as a hash function for a particular type.
    ''' </summary>
    <EditorBrowsable(EditorBrowsableState.Never)>
    Public Shadows Sub GetHashCode()
    End Sub

    ''' <summary>
    ''' Gets the System.Type of the current instance.
    ''' </summary>
    ''' <returns>The exact runtime type of the current instance.</returns>
    <EditorBrowsable(EditorBrowsableState.Never)>
    Public Shadows Function [GetType]()
        Return Me.GetType
    End Function

    ''' <summary>
    ''' Determines whether the specified System.Object instances are considered equal.
    ''' </summary>
    <EditorBrowsable(EditorBrowsableState.Never)>
    Public Shadows Sub Equals()
    End Sub

    ''' <summary>
    ''' Determines whether the specified System.Object instances are the same instance.
    ''' </summary>
    <EditorBrowsable(EditorBrowsableState.Never)>
    Private Shadows Sub ReferenceEquals()
    End Sub

    ''' <summary>
    ''' Returns a String that represents the current object.
    ''' </summary>
    <EditorBrowsable(EditorBrowsableState.Never)>
    Public Shadows Sub ToString()
    End Sub

#End Region

#Region "IDisposable Support"

    ''' <summary>
    ''' Flag to detect redundant calls at <see cref="Dispose"/> method.
    ''' </summary>
    Private disposedValue As Boolean

    ''' <summary>
    ''' Releases unmanaged and optionally managed resources.
    ''' </summary>
    ''' <param name="disposing">
    ''' <c>true</c> to release both managed and unmanaged resources;
    ''' <c>false</c> to release only unmanaged resources.
    ''' </param>
    Protected Sub Dispose(ByVal disposing As Boolean)

        If Not Me.disposedValue Then

            If disposing Then ' Dispose managed state (managed objects).

            Else ' Free unmanaged resources (unmanaged objects).
                NativeMethods.UnhookWindowsHookEx(Me.MouseHook)

            End If

        End If

        Me.disposedValue = True

    End Sub

    ''' <summary>
    ''' Allows an object to try to free resources
    ''' and perform other cleanup operations before it is reclaimed by garbage collection.
    ''' </summary>
    Protected Overrides Sub Finalize()

        ' Do not change this code. Put cleanup code in method: Dispose(ByVal disposing As Boolean)

        Me.Dispose(disposing:=False)
        MyBase.Finalize()

    End Sub

    ''' <summary>
    ''' Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
    ''' </summary>
    Private Sub Dispose() Implements IDisposable.Dispose

        ' Do not change this code. Put cleanup code in method: Dispose(ByVal disposing As Boolean)

        Me.Dispose(disposing:=True)
        GC.SuppressFinalize(obj:=Me)

    End Sub

#End Region

End Class

#End Region
#6462
Cita de: Vaagish en 26 Septiembre 2014, 01:37 AM¿No se podra cambiar la gorra por una sudadera? Vamos, no es tanta plata para ser un premio anual, para un solo competidor..  :silbar:

El administrador de la página (el-brujo) es quien decide los premios, y los premios ya los decidió.

Los premios ya se han publicado en el concurso y en twitter, sería una falta de respeto modificar los premios de pronto y solamente por que tu prefieres que lo cambiemos por otro premio que se adapte a tu gusto, como comprenderás eso NO puede suceder (a menos que el-brujo diga lo contrario) :P.

Por otro lado, si quedases en la 1ª posición del concurso eres libre de debatir este asunto con el responsable de llevar la gestión de la entrega de premios (que no se si será el-brujo u otra persona la que se encargue de ello), pero hasta entonces ya conoces la respuesta.

Un saludo!
#6463
Scripting / Re: Analizar Ejecutable En Red?
26 Septiembre 2014, 02:08 AM
Cita de: Vaagish en 26 Septiembre 2014, 01:15 AMY para rematar, alguien sabe si existe alguna forma de correr el AV sin tenerlo activo todo el tiempo? O sea, que este instalado (o no, de ser posible) y hacer un análisis puntual y volver a cerrarse.. y todo esto sin UI, que el usuario no vea nada del proceso.

Existe cierta herramienta alojada en una página que no nombraré porque no se si es una página amiga de elhacker.net, pero ya te digo que son algo 'indetectables' ;), es un multi-scanner con una GUI que como su nombre indica recopila muchos AntiVirus portables para realizar un multi-escaneo, y ahí puedes ver en la configuración de la aplicación las instrucciones que utilizan para llamar a cada antivirus por linea de comandos para realizar el escaneo, y entonces eso sería todo lo que necesitas saber, por no decir que de ahí mismo puedes obtener varios AV portables.

Aquí tienes un enlace externo fuera de esa página: https://code.google.com/p/kims/
( aunque sinceramente, no se si la herramienta seguirá en desarrollo, hace un par de años la última vez que la utilicé  )

Prueba la aplicación bajo tu única responsabilidad, por experiencia sé que los engreidos y colaboradores de esa página que no he mencionado, no son nada de fiar.

Como esa herramienta multi AV scanner conocia otra (y más profesional), cuyo nombre no recuerdo ahora mismo :-/ pero hace unos años también...

En fin, cualquier AV se puede portabilizar después de haberlo instalado con unos mínimos conocimientos, monitorizando las claves de registro que instala, replicando los servicios que instala (en caso de ser necesarios para el funcionamiento del AV) y los archivos que éste expande (a veces llega a ser un proceso tedioso), y cualquier buen AV tiene su versión CLI (Command-Line-Interface) y eso significa que puedes realizar un escaneo de forma 'invisible'.

Por otro lado, en mi opinión creo que para realizar un multi-escaneo lo mejor sería depender de algún servicio online como VirusTotal que estuviese implementado en alguna aplicación como esta: http://securityxploded.com/virus-total-scanner.php, pero commandline, claro... no me viene a la cabeza ninguna aplicación con esa característica ahora mismo (y en el futuro, lo dudo xD).

PD: Espero que la información te haya podido servir de algo.

Saludos.
#6464
Windows / Re: Windows 8.1 Ayuda
26 Septiembre 2014, 01:40 AM
Si es que... tanto echar la culpa a Windows y al final era por el cable SATA xD...

PD: Me sabe un poco mal que hayas comprado un LG, ya que al parecer te di esa recomendación y la seguiste, espero que pudieras devolver el dispositivo y recuperar ese dinerillo.

Saludos!
#6465
Hago este doble post (y perdón con antelación) para mostrar un ejemplo de uso, ya que no cabe más arriba.

Código (vbnet) [Seleccionar]
Public Class Form1

    ''' <summary>
    ''' A low level mouse hook that intercepts mouse events.
    ''' </summary>
    Friend WithEvents MouseEvents As New MouseHook(AutoStart:=False) With {.SuppressMouseUpEventWhenDoubleClick = False}

    ''' <summary>
    ''' Handles the Load event of the Form1.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        ' Start the Mouse Hook.
        Me.MouseEvents.[Start]()

    End Sub

    ''' <summary>
    ''' Handles the FormClosing event of the Form1.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="e">The <see cref="FormClosingEventArgs"/> instance containing the event data.</param>
    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) _
    Handles MyBase.FormClosing

        ' Stop and free the Mouse Hook resources.
        Me.MouseEvents.[Stop]()

    End Sub

    ''' <summary>
    ''' Handles the 'MouseMove' event of the Mouse Hook.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="MouseLocation">Contains the mouse [X,Y] coordinates where the event fired.</param>
    Private Sub MouseEvents_MouseMove(ByVal sender As Object, ByVal MouseLocation As Point) _
    Handles MouseEvents.MouseMove

        Debug.WriteLine(String.Format("Mouse Moved To: x={0}, y={1}",
                                      CStr(MouseLocation.X), CStr(MouseLocation.Y)))

    End Sub

    ''' <summary>
    ''' Handles the 'MouseLeftDown' event of the MouseHook.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="MouseLocation">Contains the mouse [X,Y] coordinates where the event fired.</param>
    Private Sub MouseEvents_MouseLeftDown(ByVal sender As Object, ByVal MouseLocation As Point) _
    Handles MouseEvents.MouseLeftDown

        Debug.WriteLine(String.Format("Mouse Left Down At: x={0}, y={1}",
                                      CStr(MouseLocation.X), CStr(MouseLocation.Y)))

    End Sub

    ''' <summary>
    ''' Handles the 'MouseLeftUp' event of the Mouse Hook.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="MouseLocation">Contains the mouse [X,Y] coordinates where the event fired.</param>
    Private Sub MouseEvents_MouseLeftUp(ByVal sender As Object, ByVal MouseLocation As Point) _
    Handles MouseEvents.MouseLeftUp

        Debug.WriteLine(String.Format("Mouse Left Up At: x={0}, y={1}",
                                      CStr(MouseLocation.X), CStr(MouseLocation.Y)))

    End Sub

    ''' <summary>
    ''' Handles the 'MouseRightDown' event of the MouseHook.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="MouseLocation">Contains the mouse [X,Y] coordinates where the event fired.</param>
    Private Sub MouseEvents_MouseRightDown(ByVal sender As Object, ByVal MouseLocation As Point) _
    Handles MouseEvents.MouseRightDown

        Debug.WriteLine(String.Format("Mouse Right Down At: x={0}, y={1}",
                                      CStr(MouseLocation.X), CStr(MouseLocation.Y)))

    End Sub

    ''' <summary>
    ''' Handles the 'MouseRightUp' event of the Mouse Hook.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="MouseLocation">Contains the mouse [X,Y] coordinates where the event fired.</param>
    Private Sub MouseEvents_MouseRightUp(ByVal sender As Object, ByVal MouseLocation As Point) _
    Handles MouseEvents.MouseRightUp

        Debug.WriteLine(String.Format("Mouse Right Up At: x={0}, y={1}",
                                      CStr(MouseLocation.X), CStr(MouseLocation.Y)))

    End Sub

    ''' <summary>
    ''' Handles the 'MouseMiddleDown' event of the MouseHook.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="MouseLocation">Contains the mouse [X,Y] coordinates where the event fired.</param>
    Private Sub MouseEvents_MouseMiddleDown(ByVal sender As Object, ByVal MouseLocation As Point) _
    Handles MouseEvents.MouseMiddleDown

        Debug.WriteLine(String.Format("Mouse Middle Down At: x={0}, y={1}",
                                      CStr(MouseLocation.X), CStr(MouseLocation.Y)))

    End Sub

    ''' <summary>
    ''' Handles the 'MouseMiddleUp' event of the Mouse Hook.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="MouseLocation">Contains the mouse [X,Y] coordinates where the event fired.</param>
    Private Sub MouseEvents_MouseMiddleUp(ByVal sender As Object, ByVal MouseLocation As Point) _
    Handles MouseEvents.MouseMiddleUp

        Debug.WriteLine(String.Format("Mouse Middle Up At: x={0}, y={1}",
                                      CStr(MouseLocation.X), CStr(MouseLocation.Y)))

    End Sub

    ''' <summary>
    ''' Handles the 'MouseLeftDoubleClick' event of the Mouse Hook.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="MouseLocation">Contains the mouse [X,Y] coordinates where the event fired.</param>
    Private Sub MouseEvents_MouseLeftDoubleClick(ByVal sender As Object, ByVal MouseLocation As Point) _
    Handles MouseEvents.MouseLeftDoubleClick

        Debug.WriteLine(String.Format("Mouse Left Double-Click At: x={0}, y={1}",
                                      CStr(MouseLocation.X), CStr(MouseLocation.Y)))

    End Sub

    ''' <summary>
    ''' Handles the 'MouseRightDoubleClick' event of the Mouse Hook.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="MouseLocation">Contains the mouse [X,Y] coordinates where the event fired.</param>
    Private Sub MouseEvents_MouseRightDoubleClick(ByVal sender As Object, ByVal MouseLocation As Point) _
    Handles MouseEvents.MouseRightDoubleClick

        Debug.WriteLine(String.Format("Mouse Right Double-Click At: x={0}, y={1}",
                                      CStr(MouseLocation.X), CStr(MouseLocation.Y)))

    End Sub

    ''' <summary>
    ''' Handles the 'MouseMiddleDoubleClick' event of the Mouse Hook.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="MouseLocation">Contains the mouse [X,Y] coordinates where the event fired.</param>
    Private Sub MouseEvents_MouseMiddleDoubleClick(ByVal sender As Object, ByVal MouseLocation As Point) _
    Handles MouseEvents.MouseMiddleDoubleClick

        Debug.WriteLine(String.Format("Mouse Middle Double-Click At: x={0}, y={1}",
                                      CStr(MouseLocation.X), CStr(MouseLocation.Y)))

    End Sub

    ''' <summary>
    ''' Handles the 'MouseWheel' event of the Mouse Hook.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="MouseLocation">Contains the mouse [X,Y] coordinates where the event fired.</param>
    ''' <param name="WheelDirection">Contains the wheel direction (WheelUp or WheelDown).</param>
    Private Sub MouseEvents_MouseWheel(ByVal sender As Object,
                                       ByVal MouseLocation As Point,
                                       ByVal WheelDirection As MouseHook.WheelDirection) _
    Handles MouseEvents.MouseWheel

        Debug.WriteLine(String.Format("Mouse Whell ({0}) At: x={1}, y={2}",
                                      WheelDirection.ToString, CStr(MouseLocation.X), CStr(MouseLocation.Y)))

    End Sub

End Class
#6466
El código que posteé hace tiempo (en el primer mensaje de este hilo) tenia unos fallos de los que no me percaté, he estado actualizando y corrigiendo el código ya que va a formar parte de la aplicación que presentaré en el EHN-DEv.

Aquí les dejo el código actualizado, estoy seguro que a alguien le servirá ya que a muchos nos apasiona los global-system hooks para Keyloggers y demás :) :

Código (vbnet) [Seleccionar]
' ***********************************************************************
' Author           : Elektro
' Last Modified On : 09-25-2014
' ***********************************************************************
' <copyright file="MouseHook.vb" company="Elektro Studios">
'     Copyright (c) Elektro Studios. All rights reserved.
' </copyright>
' ***********************************************************************

#Region " Instructions "

' Go to page:
' Project > Properties > Debug
'
' Then uncheck the option:
' "Enable the Visual Studio Hosting Process"

#End Region

#Region " Imports "

Imports System.ComponentModel
Imports System.Reflection
Imports System.Runtime.InteropServices

#End Region

#Region " MouseHook "

''' <summary>
''' A low level mouse hook class that captures mouse events.
''' </summary>
Friend NotInheritable Class MouseHook : Implements IDisposable

#Region " P/Invoke "

   ''' <summary>
   ''' Platform Invocation methods (P/Invoke), access unmanaged code.
   ''' This class does not suppress stack walks for unmanaged code permission.
   ''' <see cref="System.Security.SuppressUnmanagedCodeSecurityAttribute"/>  must not be applied to this class.
   ''' This class is for methods that can be used anywhere because a stack walk will be performed.
   ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/ms182161.aspx
   ''' </summary>
   Protected NotInheritable Class NativeMethods

#Region " Methods "

       ''' <summary>
       ''' Passes the hook information to the next hook procedure in the current hook chain.
       ''' A hook procedure can call this function either before or after processing the hook information.
       ''' For more info see here:
       ''' http://msdn.microsoft.com/en-us/library/windows/desktop/ms644974%28v=vs.85%29.aspx
       ''' </summary>
       ''' <param name="idHook">
       ''' This parameter is ignored.
       ''' </param>
       ''' <param name="nCode">
       ''' The hook code passed to the current hook procedure.
       ''' The next hook procedure uses this code to determine how to process the hook information.
       ''' </param>
       ''' <param name="wParam">
       ''' The wParam value passed to the current hook procedure.
       ''' The meaning of this parameter depends on the type of hook associated with the current hook chain.
       ''' </param>
       ''' <param name="lParam">
       ''' The lParam value passed to the current hook procedure.
       ''' The meaning of this parameter depends on the type of hook associated with the current hook chain.
       ''' </param>
       ''' <returns>
       ''' This value is returned by the next hook procedure in the chain.
       ''' The current hook procedure must also return this value.
       ''' The meaning of the return value depends on the hook type.
       ''' For more information, see the descriptions of the individual hook procedures.
       ''' </returns>
       <DllImport("user32.dll", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Auto)>
       Friend Shared Function CallNextHookEx(
              ByVal idHook As IntPtr,
              ByVal nCode As Integer,
              ByVal wParam As IntPtr,
              ByVal lParam As IntPtr
       ) As IntPtr
       End Function

       ''' <summary>
       ''' Installs an application-defined hook procedure into a hook chain.
       ''' You would install a hook procedure to monitor the system for certain types of events.
       ''' These events are associated either with a specific thread
       ''' or with all threads in the same desktop as the calling thread.
       ''' For more info see here:
       ''' http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx
       ''' </summary>
       ''' <param name="idHook">
       ''' The type of hook procedure to be installed.
       ''' </param>
       ''' <param name="lpfn">
       ''' A pointer to the hook procedure.
       ''' If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process,
       ''' the lpfn parameter must point to a hook procedure in a DLL.
       ''' Otherwise, lpfn can point to a hook procedure in the code associated with the current process.
       ''' </param>
       ''' <param name="hInstance">
       ''' A handle to the DLL containing the hook procedure pointed to by the lpfn parameter.
       ''' The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by
       ''' the current process and if the hook procedure is within the code associated with the current process.
       ''' </param>
       ''' <param name="threadId">
       ''' The identifier of the thread with which the hook procedure is to be associated.
       ''' For desktop apps, if this parameter is zero, the hook procedure is associated
       ''' with all existing threads running in the same desktop as the calling thread.
       ''' </param>
       ''' <returns>
       ''' If the function succeeds, the return value is the handle to the hook procedure.
       ''' If the function fails, the return value is NULL.
       ''' </returns>
       <DllImport("user32.dll", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Auto)>
       Friend Shared Function SetWindowsHookEx(
              ByVal idHook As HookType,
              ByVal lpfn As LowLevelMouseProcDelegate,
              ByVal hInstance As IntPtr,
              ByVal threadId As UInteger
       ) As IntPtr
       End Function

       ''' <summary>
       ''' Removes a hook procedure installed in a hook chain by the 'SetWindowsHookEx' function.
       ''' For more info see here:
       ''' http://msdn.microsoft.com/en-us/library/windows/desktop/ms644993%28v=vs.85%29.aspx
       ''' </summary>
       ''' <param name="idHook">
       ''' A handle to the hook to be removed.
       ''' This parameter is a hook handle obtained by a previous call to SetWindowsHookEx.
       ''' </param>
       ''' <returns>
       ''' If the function succeeds, the return value is nonzero.
       ''' If the function fails, the return value is zero.
       ''' </returns>
       <DllImport("user32.dll", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Auto)>
       Friend Shared Function UnhookWindowsHookEx(
              ByVal idHook As IntPtr
       ) As Boolean
       End Function

       ''' <summary>
       ''' Retrieves the current double-click time for the mouse.
       ''' A double-click is a series of two clicks of the mouse button,
       ''' the second occurring within a specified time after the first.
       ''' The double-click time is the maximum number of milliseconds that may occur
       ''' between the first and second click of a double-click.
       ''' The maximum double-click time is 5000 milliseconds.
       ''' </summary>
       ''' <returns>
       ''' The return value specifies the current double-click time, in milliseconds.
       ''' The maximum return value is 5000 milliseconds.
       ''' </returns>
       <DllImport("user32.dll", CharSet:=CharSet.Auto)>
       Friend Shared Function GetDoubleClickTime() As Integer
       End Function

#End Region

#Region " Enumerations "

       ''' <summary>
       ''' Indicates a type of Hook procedure to be installed.
       ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx
       ''' </summary>
       <Description("Enum used in 'idHook' parameter of 'SetWindowsHookEx' function")>
       Friend Enum HookType As Integer

           ' **************************************
           ' This enumeration is partially defined.
           ' **************************************

           ''' <summary>
           ''' Installs a hook procedure that monitors low-level mouse input events.
           ''' For more information, see the LowLevelMouseProc hook procedure.
           ''' </summary>
           WH_MOUSE_LL = 14I

       End Enum

#End Region

#Region " Structures "

       ''' <summary>
       ''' Contains information about a low-level mouse input event.
       ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644970%28v=vs.85%29.aspx
       ''' </summary>
       <Description("Structure used in 'lParam' parameter of 'CallNextHookEx' function")>
       Friend Structure MSLLHOOKSTRUCT

           ''' <summary>
           ''' The ptThe x- and y-coordinates of the cursor, in screen coordinates.
           ''' </summary>
           Friend pt As Point

           ''' <summary>
           ''' If the message is 'WM_MOUSEWHEEL', the high-order word of this member is the wheel delta.
           ''' The low-order word is reserved.
           ''' A positive value indicates that the wheel was rotated forward, away from the user;
           ''' a negative value indicates that the wheel was rotated backward, toward the user.
           ''' One wheel click is defined as 'WHEEL_DELTA', which is '120'.
           ''' </summary>
           Friend mouseData As Integer

           ''' <summary>
           ''' The event-injected flag.
           ''' </summary>
           Friend flags As UInteger

           ''' <summary>
           ''' The time stamp for this message.
           ''' </summary>
           Friend time As UInteger

           ''' <summary>
           ''' Additional information associated with the message.
           ''' </summary>
           Friend dwExtraInfo As IntPtr

       End Structure

#End Region

#Region " Delegates "

       ''' <summary>
       ''' Delegate LowLevelMouseProc
       ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644986%28v=vs.85%29.aspx
       ''' </summary>
       ''' <returns>
       ''' If nCode is less than zero, the hook procedure must return the value returned by CallNextHookEx.
       ''' 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.
       ''' 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.
       ''' </returns>
       Friend Delegate Function LowLevelMouseProcDelegate(
               ByVal nCode As IntPtr,
               ByVal wParam As IntPtr,
               ByRef lParam As NativeMethods.MSLLHOOKSTRUCT
       ) As IntPtr

#End Region

#Region " Hidden Methods "

       ''' <summary>
       ''' Determines whether the specified System.Object instances are considered equal.
       ''' </summary>
       <EditorBrowsable(EditorBrowsableState.Never)>
       Public Shadows Sub Equals()
       End Sub

       ''' <summary>
       ''' Determines whether the specified System.Object instances are the same instance.
       ''' </summary>
       <EditorBrowsable(EditorBrowsableState.Never)>
       Private Shadows Sub ReferenceEquals()
       End Sub

#End Region

   End Class

#End Region

#Region " Objects "

   ''' <summary>
   ''' Handle to the hook procedure.
   ''' </summary>
   Private MouseHook As IntPtr

   ''' <summary>
   ''' The mouse hook delegate.
   ''' </summary>
   Private MouseHookDelegate As NativeMethods.LowLevelMouseProcDelegate

#End Region

#Region " Properties "

   ''' <summary>
   ''' ** ONLY FOR TESTING PURPOSES **
   ''' Gets or sets a value indicating whether to suppress the last MouseUp event of
   ''' the specified clicked button when a double-click fires.
   '''
   ''' If this value is set to <c>true</c>, the application will send the events in this order for a Double-Click:
   ''' MouseDown, MouseUp, MouseDown, MouseDoubleClick
   '''
   ''' If this value is set to <c>false</c>, the application will send the events in this order for a Double-Click:
   ''' MouseDown, MouseUp, MouseDown, MouseUp, MouseDoubleClick
   '''
   ''' </summary>
   ''' <value><c>true</c> if MouseUp event is suppressed; otherwise <c>false</c>.</value>
   Friend Property SuppressMouseUpEventWhenDoubleClick As Boolean = False

#End Region

#Region " Enumerations "

   ''' <summary>
   ''' Indicates a Windows Message related to a mouse events.
   ''' For more info see here:
   ''' http://msdn.microsoft.com/en-us/library/windows/desktop/ff468877%28v=vs.85%29.aspx
   ''' </summary>
   Private Enum MouseMessages As UInteger

       ''' <summary>
       ''' Posted to a window when the cursor moves.
       ''' If the mouse is not captured, the message is posted to the window that contains the cursor.
       ''' Otherwise, the message is posted to the window that has captured the mouse
       ''' </summary>
       WM_MOUSEMOVE = &H200UI

       ''' <summary>
       ''' Posted when the user presses the left mouse button while the cursor is in the client area of a window.
       ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
       ''' Otherwise, the message is posted to the window that has captured the mouse
       ''' </summary>
       WM_LBUTTONDOWN = &H201UI

       ''' <summary>
       ''' Posted when the user releases the left mouse button while the cursor is in the client area of a window.
       ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
       ''' Otherwise, the message is posted to the window that has captured the mouse
       ''' </summary>
       WM_LBUTTONUP = &H202UI

       ''' <summary>
       ''' Posted when the user presses the right mouse button while the cursor is in the client area of a window.
       ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
       ''' Otherwise, the message is posted to the window that has captured the mouse
       ''' </summary>
       WM_RBUTTONDOWN = &H204UI

       ''' <summary>
       ''' Posted when the user releases the right mouse button while the cursor is in the client area of a window.
       ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
       ''' Otherwise, the message is posted to the window that has captured the mouse
       ''' </summary>
       WM_RBUTTONUP = &H205UI

       ''' <summary>
       ''' Posted when the user presses the middle mouse button while the cursor is in the client area of a window.
       ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
       ''' Otherwise, the message is posted to the window that has captured the mouse
       ''' </summary>
       WM_MBUTTONDOWN = &H207UI

       ''' <summary>
       ''' Posted when the user releases the middle mouse button while the cursor is in the client area of a window.
       ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
       ''' Otherwise, the message is posted to the window that has captured the mouse
       ''' </summary>
       WM_MBUTTONUP = &H208UI

       ''' <summary>
       ''' Sent to the active window when the mouse's horizontal scroll wheel is tilted or rotated.
       ''' The DefWindowProc function propagates the message to the window's parent.
       ''' There should be no internal forwarding of the message,
       ''' since DefWindowProc propagates it up the parent chain until it finds a window that processes it.
       ''' </summary>
       WM_MOUSEWHEEL = &H20AUI

   End Enum

   ''' <summary>
   ''' Indicates the whell direction of the mouse.
   ''' </summary>
   Public Enum WheelDirection As Integer

       ''' <summary>
       ''' The wheel is moved up.
       ''' </summary>
       WheelUp = 1

       ''' <summary>
       ''' The wheel is moved down.
       ''' </summary>
       WheelDown = 2

   End Enum

#End Region

#Region " Events "

   ''' <summary>
   ''' Occurs when the mouse moves.
   ''' </summary>
   Friend Event MouseMove(ByVal sender As Object,
                          ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when the mouse left button is pressed.
   ''' </summary>
   Friend Event MouseLeftDown(ByVal sender As Object,
                              ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when the mouse left button is released.
   ''' </summary>
   Friend Event MouseLeftUp(ByVal sender As Object,
                            ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when the mouse left button performs a double-click.
   ''' A double click is considered as: (MouseLeftDown + MouseLeftUp) * 2
   ''' </summary>
   Friend Event MouseLeftDoubleClick(ByVal sender As Object,
                                     ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when the mouse right button is pressed.
   ''' </summary>
   Friend Event MouseRightDown(ByVal sender As Object,
                               ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when the mouse right button is released.
   ''' </summary>
   Friend Event MouseRightUp(ByVal sender As Object,
                             ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when the mouse right button performs a double-click.
   ''' A double click is considered as: (MouseLeftDown + MouseLeftUp) * 2
   ''' </summary>
   Friend Event MouseRightDoubleClick(ByVal sender As Object,
                                      ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when the mouse middle button is pressed.
   ''' </summary>
   Friend Event MouseMiddleDown(ByVal sender As Object,
                                ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when the mouse middle button is released.
   ''' </summary>
   Friend Event MouseMiddleUp(ByVal sender As Object,
                              ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when the mouse middle button performs a double-click.
   ''' A double click is considered as: (MouseLeftDown + MouseLeftUp) * 2
   ''' </summary>
   Friend Event MouseMiddleDoubleClick(ByVal sender As Object,
                                       ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when the mouse wheel is moved up or down.
   ''' </summary>
   Friend Event MouseWheel(ByVal sender As Object,
                           ByVal MouseLocation As Point,
                           ByVal WheelDirection As WheelDirection)

#End Region

#Region " Constructors "

   ''' <summary>
   ''' Prevents a default instance of the <see cref="MouseHook"/> class from being created.
   ''' </summary>
   Private Sub New()
   End Sub

   ''' <summary>
   ''' Initializes a new instance of the <see cref="MouseHook"/> class.
   ''' </summary>
   ''' <param name="AutoStart">
   ''' If set to <c>true</c>, the Hook starts instantly for this <see cref="MouseHook"/> instance.
   ''' </param>
   Friend Sub New(Optional ByVal AutoStart As Boolean = False)

       If AutoStart Then
           Me.[Start]()
       End If

   End Sub

#End Region

#Region " Public Methods "

   ''' <summary>
   ''' Starts the Mouse Hook, then start processing messages to fire events.
   ''' </summary>
   Friend Sub [Start]()

       Me.MouseHookDelegate = New NativeMethods.LowLevelMouseProcDelegate(AddressOf LowLevelMouseProc)

       Try
           Me.MouseHook = NativeMethods.SetWindowsHookEx(NativeMethods.HookType.WH_MOUSE_LL,
                                                         Me.MouseHookDelegate,
                                                         Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly.GetModules()(0)).ToInt32, 0)

       Catch ex As Exception
           Throw

       End Try

   End Sub

   ''' <summary>
   ''' Stops the Mouse Hook and free all resources, then stop processing messages to fire events.
   ''' </summary>
   Friend Sub [Stop]()

       Me.Finalize()

   End Sub

#End Region

#Region " Private Methods "

   ''' <summary>
   ''' Processes the mouse windows messages and raises it's corresponding events.
   ''' MSDN Documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644986%28v=vs.85%29.aspx
   ''' </summary>
   ''' <param name="nCode">
   ''' A code the hook procedure uses to determine how to process the message.
   ''' If nCode is less than zero, the hook procedure must pass the message to the CallNextHookEx function
   ''' without further processing and should return the value returned by CallNextHookEx.
   ''' </param>
   ''' <param name="wParam">The identifier of the mouse message.</param>
   ''' <param name="lParam"> A pointer to an <see cref="NativeMethods.MSLLHOOKSTRUCT"/> structure.</param>
   ''' <returns>
   ''' If nCode is less than zero, the hook procedure must return the value returned by CallNextHookEx.
   ''' 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.
   ''' 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.
   ''' </returns>
   Private Function LowLevelMouseProc(ByVal nCode As Integer,
                                      ByVal wParam As MouseMessages,
                                      ByRef lParam As NativeMethods.MSLLHOOKSTRUCT) As Integer

       Static LeftClickTime As Integer = 0I ' Determines a left button double-click.
       Static RightClickTime As Integer = 0I ' Determines a right button double-click.
       Static MiddleClickTime As Integer = 0I ' Determines a middle button double-click.

       If nCode = 0I Then

           Select Case wParam

               Case MouseMessages.WM_MOUSEMOVE
                   RaiseEvent MouseMove(Me, lParam.pt)

               Case MouseMessages.WM_LBUTTONDOWN
                   RaiseEvent MouseLeftDown(Me, lParam.pt)

               Case MouseMessages.WM_LBUTTONUP
                   If LeftClickTime <> 0 Then
                       LeftClickTime = Environment.TickCount() - LeftClickTime
                   End If

                   If (LeftClickTime <> 0) AndAlso (LeftClickTime < NativeMethods.GetDoubleClickTime()) Then
                       LeftClickTime = 0
                       If Not Me.SuppressMouseUpEventWhenDoubleClick Then
                           RaiseEvent MouseLeftUp(Me, lParam.pt)
                       End If
                       RaiseEvent MouseLeftDoubleClick(Me, lParam.pt)

                   Else
                       LeftClickTime = Environment.TickCount()
                       RaiseEvent MouseLeftUp(Me, lParam.pt)

                   End If

               Case MouseMessages.WM_RBUTTONDOWN
                   RaiseEvent MouseRightDown(Me, lParam.pt)

               Case MouseMessages.WM_RBUTTONUP
                   If RightClickTime <> 0 Then
                       RightClickTime = Environment.TickCount() - RightClickTime
                   End If

                   If (RightClickTime <> 0) AndAlso (RightClickTime < NativeMethods.GetDoubleClickTime()) Then
                       RightClickTime = 0
                       If Not Me.SuppressMouseUpEventWhenDoubleClick Then
                           RaiseEvent MouseRightUp(Me, lParam.pt)
                       End If
                       RaiseEvent MouseRightDoubleClick(Me, lParam.pt)

                   Else
                       RightClickTime = Environment.TickCount()
                       RaiseEvent MouseRightUp(Me, lParam.pt)

                   End If

               Case MouseMessages.WM_MBUTTONDOWN
                   RaiseEvent MouseMiddleDown(Me, lParam.pt)

               Case MouseMessages.WM_MBUTTONUP
                   If MiddleClickTime <> 0 Then
                       MiddleClickTime = Environment.TickCount() - MiddleClickTime
                   End If

                   If (MiddleClickTime <> 0) AndAlso (MiddleClickTime < NativeMethods.GetDoubleClickTime()) Then
                       MiddleClickTime = 0
                       If Not Me.SuppressMouseUpEventWhenDoubleClick Then
                           RaiseEvent MouseMiddleUp(Me, lParam.pt)
                       End If
                       RaiseEvent MouseMiddleDoubleClick(Me, lParam.pt)

                   Else
                       MiddleClickTime = Environment.TickCount()
                       RaiseEvent MouseMiddleUp(Me, lParam.pt)

                   End If

               Case MouseMessages.WM_MOUSEWHEEL
                   RaiseEvent MouseWheel(Me, lParam.pt, If(lParam.mouseData < 0,
                                                           WheelDirection.WheelDown,
                                                           WheelDirection.WheelUp))

               Case Else
                   Exit Select ' Do Nothing

           End Select

           Return 0

       ElseIf nCode < 0I Then

           ' Initialize unmanged memory to hold the 'MSLLHOOKSTRUCT' structure.
           Dim pnt As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(lParam))

           Try ' MSDN Documentation: http://msdn.microsoft.com/en-us/library/vstudio/4ca6d5z7%28v=vs.100%29.aspx

               ' Copy the struct to unmanaged memory.
               Marshal.StructureToPtr(lParam, pnt, False)

               ' Return
               Return NativeMethods.CallNextHookEx(MouseHook, nCode, wParam, pnt)

           Finally
               ' Free the unmanaged memory.
               Marshal.FreeHGlobal(pnt)
           End Try

       Else ' nCode > 0

           Return -1I

       End If

   End Function

#End Region

#Region " Hidden Methods "

   ''' <summary>
   ''' Serves as a hash function for a particular type.
   ''' </summary>
   <EditorBrowsable(EditorBrowsableState.Never)>
   Public Shadows Sub GetHashCode()
   End Sub

   ''' <summary>
   ''' Gets the System.Type of the current instance.
   ''' </summary>
   ''' <returns>The exact runtime type of the current instance.</returns>
   <EditorBrowsable(EditorBrowsableState.Never)>
   Public Shadows Function [GetType]()
       Return Me.GetType
   End Function

   ''' <summary>
   ''' Determines whether the specified System.Object instances are considered equal.
   ''' </summary>
   <EditorBrowsable(EditorBrowsableState.Never)>
   Public Shadows Sub Equals()
   End Sub

   ''' <summary>
   ''' Determines whether the specified System.Object instances are the same instance.
   ''' </summary>
   <EditorBrowsable(EditorBrowsableState.Never)>
   Private Shadows Sub ReferenceEquals()
   End Sub

   ''' <summary>
   ''' Returns a String that represents the current object.
   ''' </summary>
   <EditorBrowsable(EditorBrowsableState.Never)>
   Public Shadows Sub ToString()
   End Sub

#End Region

#Region "IDisposable Support"

   ''' <summary>
   ''' Flag to detect redundant calls at <see cref="Dispose"/> method.
   ''' </summary>
   Private disposedValue As Boolean

   ''' <summary>
   ''' Releases unmanaged and optionally managed resources.
   ''' </summary>
   ''' <param name="disposing">
   ''' <c>true</c> to release both managed and unmanaged resources;
   ''' <c>false</c> to release only unmanaged resources.
   ''' </param>
   Protected Sub Dispose(ByVal disposing As Boolean)

       If Not Me.disposedValue Then

           If disposing Then ' Dispose managed state (managed objects).

           Else ' Free unmanaged resources (unmanaged objects).
               NativeMethods.UnhookWindowsHookEx(Me.MouseHook)

           End If

       End If

       Me.disposedValue = True

   End Sub

   ''' <summary>
   ''' Allows an object to try to free resources
   ''' and perform other cleanup operations before it is reclaimed by garbage collection.
   ''' </summary>
   Protected Overrides Sub Finalize()

       ' Do not change this code. Put cleanup code in method: Dispose(ByVal disposing As Boolean)

       Me.Dispose(disposing:=False)
       MyBase.Finalize()

   End Sub

   ''' <summary>
   ''' Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
   ''' </summary>
   Private Sub Dispose() Implements IDisposable.Dispose

       ' Do not change this code. Put cleanup code in method: Dispose(ByVal disposing As Boolean)

       Me.Dispose(disposing:=True)
       GC.SuppressFinalize(obj:=Me)

   End Sub

#End Region

End Class

#End Region

#6467
Algunas aplicaciones están escritas en C# + Xaml donde puedes ver practicamente el source porque viene sin ningún tipo de ofuscación, pero creo que esas aplicaciones no te interesan tanto (ya que son ModernApps).

La mayoría de aplicaciones de Windows están escritas en C/C++ y la verdad es que nunca me ha dado el gusanillo de intentar inspeccionar las instrucciones del source de estas aplicaciones (tampoco se si sería capaz de conseguirlo, no soy ningún experto en la ingenieria inversa) pero supongo que con la ayuda de un dissasembler y un decompiler podrías ver un source PARCIAL de las aplicaciones que te interesan (CommandLine) que vienen en Windows, imagino que el método sería el mismo como con cualquier otra aplicacion de terceros.

Saludos!
#6468
Cita de: xnmm en 25 Septiembre 2014, 20:44 PM
es un buen post ciertamente  :) :) :) :) :) pero yo necesito todas esas funciones para GNU/LINUX es decir para un script en /bin/bash porque en windows si lo se (gracias a elektro) pero en linux no, yo quisiera saber si hay algun post con esto solo que para el bash. Les agradeceria mucho que me ayudaran  :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes:

puff... pues va a estar complicado en el foro encontrar un hilo de estas características para Bash, pero siempre puedes recurrir a la ayuda de San-Google :):


Advanced Bash-Scripting Guide:
Prev   Chapter 10. Manipulating Variables



Bash String Manipulation Examples
Length, Substring, Find and Replace



16.4. Text Processing Commands
Commands affecting text and text files


Saludos!
#6469
Lus, como habrás visto el código no cabe en el espacio libre de caracteres asignado para formular un post (algo de lo que me he quejado bastantes veces ya).

Si realmente estás interesado en compartirlo, súbelo a pastebin (por ejemplo), edita tu comentario y publica un enlace directo al código, de lo contrario lo tendré que eliminar porque solo se ve medio código (y eso no le sirve a nadie :-/).

Saludos!
#6470
Porfavor, formular las preguntas en el post que publicó el compañero KuB0x, que para algo está el post.

[EHN-Dev 2014] - Hilo de discusión / comentarios / dudas




Cita de: erest0r en 25 Septiembre 2014, 13:17 PM¿Tienen alguna manera de saber si un código es original de alguien? Lo que pasa es que yo he estado actualmente practicando para crear jueguitos, y como hay varios lugares donde publican los códigos fuentes de estos ¿Cómo puedo asegurarles que ese código fue escrito por mi?

No hay ninguna regla en el concurso sobre la legitimidad de un código, precisamente porque no vamos a realizar un seguimiento exhaustivo con cada parte del código que escribas para intentar verificar si es de tu propiedad o es ajeno... sería una locura, por otro lado confiamos en que todos los participantes no copien el trabajo de los demás, y si lo hicieran, el autor de dicho código deberá haberte permitido el uso de su código en tuaplicación, obviamente si detectamos que tu trabajo no te pertenece a ti, o que practicamente todo el código es copiado de otra persona entonces se tomarían las medidas apropiadas a la situación resultando en una posible sanción/descalificación del concurso.

Cita de: erest0r en 25 Septiembre 2014, 13:17 PMes necesario que el código este en español,

Esa pregunta stá respondida en el FAQ del consurso.

[EHN-Dev 2014] - Concurso de desarrollo de aplicaciones (Hilo oficial)

Saludos!