Autor: admin

  • web online to test if your bot is a bot or not ?

    Several online tools can test if your bot, web scraper, or automated browser script is being detected as a bot by analyzing your fingerprint, IP address, and behavior. 

    Top Web Tools for Testing Bot Detection

    • Pixelscan (pixelscan.net): A highly recommended, modern tool that analyzes your browser fingerprint, proxy behavior, and connection details to tell you if you are flagged as «Human» or «Bot».
    • CreepJS (abrahamjuliot.github.io/creepjs): A very advanced, rigorous tool for analyzing browser fingerprints, often used to test how «insane» or unique a browser setup is.
    • BrowserScan (browserscan.net): Checks for automation, WebGL, WebRTC leaks, and browser properties to determine if your environment is controlled by a robot.
    • BrowserLeaks (browserleaks.com): Provides comprehensive, detailed information about your browser, IP, and web technologies (Canvas, WebGL, DNS).
    • f.vision: A tool for testing browser fingerprinting and leakage.
    • WhatLeaks (whatleaks.com): Focuses heavily on proxy, VPN, and networking detection aspects.
    • Sannysoft (bot.sannysoft.com): A classic, simple test to see if navigator.webdriver is detected. 

    What These Tools Test For

    • Fingerprint Consistency: They check if your user agent matches your browser capabilities (e.g., if you claim to be Chrome on Windows but have Linux-specific fonts).
    • Headless Detection: They identify if you are running in headless mode (e.g., Headless Chrome), which is a common sign of automation.
    • Proxy/VPN Usage: They analyze your IP address reputation to see if it is from a known data center, which is often flagged.
    • Behavioral Signals: Some tools (like advanced CAPTCHA tests) analyze mouse movements, typing speed, and page interaction timing. 

    How to Use Them

    1. Open the tool (e.g., pixelscan.net) using your bot’s browser instance (Puppeteer, Selenium, Playwright).
    2. Navigate to the site.
    3. Read the «Bot Detected» or «Human Detected» status to identify which parameters are giving you away
  • DB Tuning Pt1 SP etc

    Hei, or hi, see below screen and the main Stored Procedure that the BOTs will check for. I hope you like it, or not.

    as said, the SP

    USE [superbots]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[SERVERS.BOTS.INSTANCES.SelectOrCreateAndSelect] (
    	  @Bot_Name NVarChar(8) =  N'WinForms'
    	, @OS NVarChar(16), @OS_ID int = NULl
    	, @Server_Serial nvarchar(64), @Server_MachineName NVarChar(32), @Server_Language NChar(2) = N'es'
    	, @Server_PhysicalCores tinyInt, @Server_LogicalCores tinyint, @Server_PhysicalCoresMaxMhz tinyInt
    	, @Server_ID int = NULL
    	, @Settings_Bots_Instances_MaxMinsOfInactivity tinyInt = NULL
    	, @Language nchar(2) = NULL, @Country nchar(4) = NULL
    
    ) 
    AS
    BEGIN
    	SET NOCOUNT ON
    	DECLARE @Bot_ID tinyINT;
    	DECLARE @Bot_Instance_ID INT; 
    	DECLARE @Server_MaxBotInstances TinyINT;
    	SET @OS_ID = (SELECT TOP 1 [OS.ID] FROM dbo.[OS] AS O WHERE O.[OS] = @OS)
    	IF EXISTS (
    		SELECT * FROM
    		dbo.[Servers] AS S WHERE S.[Server.MachineName] = @Server_MachineName
    	)
    		BEGIN
    			SELECT TOP 1 @Server_ID = [Server.ID], @Server_MaxBotInstances = [Server.MaxBotInstances] FROM dbo.[Servers] AS S WHERE S.[Server.MachineName] = @Server_MachineName AND S.[Server.Active] = 1
    		END
    	ELSE
    		BEGIN
    			INSERT INTO dbo.[Servers] ([OS.ID], [Server.MachineName], [Server.Language],[Server.PhysicalCores], [Server.LogicalCores], [Server.PhysicalCoresMaxMhz] ) VALUES (@OS_ID, @Server_MachineName,@Server_Language,@Server_PhysicalCores,@Server_LogicalCores, @Server_PhysicalCoresMaxMhz )
    			SET @Server_ID = (SELECT SCOPE_IDENTITY())
    			SET @Server_MaxBotInstances = (SELECT [Server.MaxBotInstances]  FROM dbo.[SERVERS] AS S WHERE S.[Server.ID] = @Server_ID )
    		END;
    	
    	-- Buscar instancia de de ultima fecha al menos 6 horas desde ahora que no tenga actividad
    	SET @Settings_Bots_Instances_MaxMinsOfInactivity = (SELECT TOP 1 [Settings.Bots.Instances.MaxMinsOfInactivity] FROM dbo.[SETTINGS] AS STT WHERE STT.[Setting.IsDefault] = 1 ORDER BY STT.[Setting.ID] DESC)
    	SET @Bot_ID = (SELECT [Bot.ID] FROM dbo.[BOTS] AS B WHERE B.[Bot.Name] = @Bot_Name )
    
    
    	--VER SI EXISTE INSTANCIA O SE DEBE CREAR
    	IF EXISTS(
    		SELECT * FROM dbo.[SERVERS.BOTS.INSTANCES] AS SBI
    		INNER JOIN dbo.[BOT.INSTANCES] AS BI ON BI.[Bot.Instance.ID] = SBI.[Bot.Instance.ID]
    		INNER JOIN dbo.[BOTS] AS B ON B.[Bot.ID] = BI.[Bot.ID]
    		INNER JOIN dbo.[SERVERS] AS S ON S.[Server.ID] = SBI.[Server.ID]
    		WHERE B.[Bot.Physical] = 0 AND BI.[Bot.Instance.Active] = 1 AND B.[Bot.Name] = @Bot_Name 
    		AND SBI.[Server.ID] = @Server_ID
    		AND BI.[Bot.Instance.LastOperationDate] <  DATEADD(MINUTE,@Settings_Bots_Instances_MaxMinsOfInactivity,SYSDATETIME())
    
    	)
    		BEGIN
    			SELECT @Bot_Instance_ID = BI.[Bot.Instance.ID]
    			FROM dbo.[SERVERS.BOTS.INSTANCES] AS SBI
    			INNER JOIN dbo.[BOT.INSTANCES] AS BI ON BI.[Bot.Instance.ID] = SBI.[Bot.Instance.ID]
    			INNER JOIN dbo.[BOTS] AS B ON B.[Bot.ID] = BI.[Bot.ID]
    			INNER JOIN dbo.[SERVERS] AS S ON S.[Server.ID] = SBI.[Server.ID]
    			WHERE B.[Bot.Physical] = 0 AND BI.[Bot.Instance.Active] = 1 AND B.[Bot.Name] = @Bot_Name 
    			AND SBI.[Server.ID] = @Server_ID
    			AND BI.[Bot.Instance.LastOperationDate] <  DATEADD(MINUTE,@Settings_Bots_Instances_MaxMinsOfInactivity,SYSDATETIME())
    
    		END
    	ELSE
    		BEGIN
    		-- NO EXISTE NINGUNA INSTANCIA, DEBE CREARSE PUES, SIEMPRE Y CUANDO NO NOS SOBREPASEMOS DE INSTANCIAS POR SERVIDOR
    			DECLARE @ActualInstances tinyINT = 0;
    			--CHECKEAR QUE NO SE HAYA SOBREPASADO, O IGUALADO EL LIMITE DE MAX INSTANCIAS POR SERVER
    			SELECT @ActualInstances = COUNT(*)
    			FROM dbo.[SERVERS.BOTS.INSTANCES] AS SBI
    			INNER JOIN dbo.[BOT.INSTANCES] AS BI ON BI.[Bot.Instance.ID] = SBI.[Bot.Instance.ID]
    			INNER JOIN dbo.[BOTS] AS B ON B.[Bot.ID] = BI.[Bot.ID]
    			INNER JOIN dbo.[SERVERS] AS S ON S.[Server.ID] = SBI.[Server.ID]
    			WHERE B.[Bot.Physical] = 0 AND BI.[Bot.Instance.Active] = 1 AND B.[Bot.Name] = @Bot_Name 
    			AND SBI.[Server.ID] = @Server_ID
    			AND BI.[Bot.Instance.LastOperationDate] <  DATEADD(MINUTE,@Settings_Bots_Instances_MaxMinsOfInactivity,SYSDATETIME())
    
    			IF @ActualInstances  >=  @Server_MaxBotInstances 
    				BEGIN
    					RETURN SELECT -4
    				END
    			ELSE
    				BEGIN
    					--CREAR INSTANCIA: BOTSINSTANCES, SERVER.BOT.INSTANCES
    					INSERT INTO dbo.[BOTS.INSTANCES]
    					([Bot.ID], [IP.ID] )
    					VALUES
    					(@Bot_ID, 
    					
    						(
    							SELECT TOP 1 [IP.ID] FROM [IPS] AS I WHERE NOT I.[IP.ID]  IN (
    								SELECT BI.[IP.ID] FROM dbo.[SERVERS.BOTS.INSTANCES] AS SBI
    								INNER JOIN dbo.[BOT.INSTANCES] AS BI ON BI.[Bot.Instance.ID] = SBI.[Bot.Instance.ID]
    								INNER JOIN dbo.[BOTS] AS B ON B.[Bot.ID] = BI.[Bot.ID]
    								INNER JOIN dbo.[SERVERS] AS S ON S.[Server.ID] = SBI.[Server.ID]
    								WHERE B.[Bot.Physical] = 0 AND BI.[Bot.Instance.Active] = 1 
    								AND B.[Bot.Name] = @Bot_Name 
    								AND SBI.[Server.ID] = @Server_ID
    								AND BI.[Bot.Instance.LastOperationDate] <  DATEADD(MINUTE,@Settings_Bots_Instances_MaxMinsOfInactivity,SYSDATETIME())
    
    							) AND I.[Country] = ISNULL(@Country, I.[Country]) 
    							  AND LEFT(I.[Country],2) = ISNULL(@language, LEFT(I.[Country],2))
    						
    						)
    					
    					)
    
    					SET @Bot_Instance_ID = (SELECT SCOPE_IDENTITY())
    
    				
    				END
    		END
    
    		IF NOT EXISTS (SELECT * FROM  dbo.[SERVERS.BOTS.INSTANCES] WHERE [Server.ID] = @Server_ID AND [Bot.Instance.ID] = @Bot_Instance_ID )
    		BEGIN
    			INSERT INTO  dbo.[SERVERS.BOTS.INSTANCES] ([Server.ID],  [Bot.Instance.ID] ) VALUES ( @Server_ID, @Bot_Instance_ID)
    		END
    
    
    		SELECT * FROM dbo.[SERVERS.BOTS.INSTANCES] AS SBI
    		INNER JOIN dbo.[SERVERS] AS S ON S.[Server.ID] = SBI.[Server.ID]
    		INNER JOIN dbo.[OS] AS O ON O.[OS.ID] = S.[OS.ID] 
    			INNER JOIN dbo.[BOTS.INSTANCES] AS BI ON BI.[Bot.Instance.ID] = SBI.[Bot.Instance.ID] 
    		INNER JOIN dbo.[IPS] AS I ON I.[IP.ID] = BI.[IP.ID] 
    		INNER JOIN dbo.[BOTS] AS B ON B.[Bot.ID] = BI.[Bot.ID] 
    		INNER JOIN dbo.[ACCOUNTS] AS A ON A.[Account.ID] = BI.[Account.ID]
    		INNER JOIN dbo.[ACCOUNTS.KEYWORDS] AS AK ON AK.[Account.ID] = A.[Account.ID]
    		
    		WHERE SBI.[Bot.Instance.ID] = @Bot_Instance_ID AND S.[Server.ID] = @Server_ID AND S.[Server.Active] = 1 AND BI.[Bot.Instance.Active] = 1
    		
    
    		--PENDIENTE: COMO RELACIONAR UN ACCOUNT Y UNOS HUMANS, CON LA INSTANCIA DEL BOT ACTUAL ?
    			-- PONER Account.Id en Bot.Instancias ? SI
    				-- Y PARA ELLO HACER CUENTA ACCOUNTS (la actual devices.account renombrarla) y en vez de poner account id como property de devices o de server.bla bla, ponerla como propiedad de bot.instanes
    
    		--una vez finalizado, pegar en doninam y luego testear y actualizar doninam si fuere el caso
    
    
    
    
    END
    

  • Programming a BOT

    Either a BOT for Winforms, WPF, Android or whataver

    First, when the bot is loading (so when OnLoad event gets fired) it must know if he already exist (in database) or if it must request a new creation.

    This will be done by calling a T-SQL Stored Procedure we will create for

    This will check, based on the OS and Name of the computer or device where its been deployed (Server.ID or Device.ID for physical devices),

    if NOT exist any bot.instance created, then

    creates one, while there will be no more than MaxBotInstances for this server

    if exists one (order by LastOperationDate asc (older first) where Active = true, and at least 12 hours of inactivity has been passed, cause a bot cannot be more than 12 hourts with inactivity.. more on this later eg. if only one url to go for, then at least 6 hours must be passed between reloads, according to youtube tests)

    RETURNS

    Bot.Instance.ID

  • Database Diagram Part 1

    The software and the machines

    diagram doninam database part 1

    v 087d

  • What a bot says currently about us

    Asked today a few hours ago to Today is 26 January 2026 here in a Spoken Spanish Country

    https://www.kimi.com/chat/d5rojj3bpakb79h967lg

    ’ll fetch the content from that URL and look for the DIY, no-purchase method.The page is short, but it already tells the whole story: the “do-it-yourself, no-buy” method promoted on doninam.com is to build your own view-bot network—rent servers + proxies, write code that emulates human watch sessions, and bypass YouTube’s anti-bot defences.
    In other words, it’s a programming-heavy, black-hat route that deliberately violates YouTube’s Terms of Service. If you want the details you’ll have to follow the author’s future posts (he only teases the concept so far), but the takeaway is clear: there is no legitimate “free“ trick inside—just an invitation to code your own fake traffic, with all the usual risks (detection, termination, possible legal action).

  • Proxies can be detected

    resume if you ask «can js know if you’re behind a proxy ?»

    google shows

    JavaScript cannot directly access your system’s proxy settings or network configuration due to browser security sandboxing. However, JS can be used to infer that you are behind a proxy through several indirect technical methods

    1. WebRTC IP Leakage

    JavaScript can use the WebRTC API (specifically RTCPeerConnection) to bypass your proxy and discover your «real» local or public IP address. If the IP detected via WebRTC differs from the IP making the HTTP request, the site knows a proxy or VPN is in use. 

    2. Network Latency Analysis (TCP Handshake)

    Sites can compare the time it takes for a JavaScript-initiated request (like a WebSocket message) to reach their server against the initial TCP handshake time. 

    • Normal: Handshake and JS request have similar latencies.
    • Proxy Detect: The TCP handshake happens between the server and the proxy, while the JS request must travel the full distance from your browser, through the proxy, to the server. This discrepancy flags proxy usage. 

    3. Timezone and Geolocation Mismatches

    JS can check your local system time (Intl.DateTimeFormat) and browser language settings. If your system clock is set to London (GMT) but your IP address shows you are in New York (EST), it is a strong indicator of a proxy or location-spoofing tool. 

    4. Detecting HTTP Headers

    While JS itself can’t see the headers of the request it is currently running in, it can make a fetch request to an endpoint (like httpbin.org) that echoes back the headers. Many proxies automatically inject headers like: 

    • X-Forwarded-For
    • Via
    • X-Client-IP 

    5. Advanced Fingerprinting 

    Modern anti-bot scripts (like Cloudflare or Akamai) use JS to collect dozens of data points about your hardware, fonts, and browser behavior. They compare this «fingerprint» against databases of known proxy data centers. If your browser fingerprint matches a profile typically associated with automated scripts or data center IPs, you will be flagged. 

    SO, I will be examining those factors, be aware that some are not true at all

    example: https://stackoverflow.com/questions/19767589/how-to-detect-a-proxy-using-javascript this said can detect a proxy, but it does not

    ANY WAY: THINGS TO CONSIDER

    Use the bots on same country (time zone) where the IPs you’ll use are located. So do not use say USA IP’s if your Virtual machines are located on say GErmaby

  • Saved on wayback machine

    In order for its long term availability, as for the truth must be preserved

    https://web.archive.org/web/20260120172129/https://www.doninam.com/

  • Human Emulation Scroll

    To be a litle more difficult, cause, in emulating cursor (previous article) the target website (so youtube) does not know if any code was injected (as no one code was injected) cause the Bot app emulate the cursor, easy, but, in scrolling, some sources says to use , where N = bla bla

    browser.ExecuteScriptAsync("window.scroll(0,N);");

    but , say to IA «can js detect browser.ExecuteScriptAsync»

    results in

    JavaScript cannot directly detect the execution of a browser.ExecuteScriptAsync call because this method is part of the host application’s API (such as WebView2 or CefSharp) and operates outside the standard JavaScript environment. 

    However, a script can indirectly detect its own injection or «presence» using the following methods:

    1. Self-Identification via State

    If the host application uses ExecuteScriptAsync to set a global variable, standard JavaScript can check for that variable’s existence. 

    • Detection logic: if (window.myInjectionFlag) { ... }

    2. Monitoring DOM or Event Changes

    Since ExecuteScriptAsync is often used to modify the DOM or trigger events, JavaScript can use a MutationObserver to watch for unexpected changes that did not originate from the page’s original scripts. 

    3. Stack Trace Analysis

    In some environments, if a script is executed via an external command, the Error().stack property might reveal a unique trace (e.g., <anonymous> or specific internal wrappers), though this is highly implementation-specific and unreliable for robust detection. 

    4. Communication Back to Host

    The most common way for JavaScript to «acknowledge» an external script execution is to use host-provided bridges like:

    • WebView2: window.chrome.webview.postMessage().
    • CefSharp: CefSharp.PostMessage() or bound objects. 

    For more details on implementing these interfaces, see the official documentation for WebView2 APIs or the CefSharp WebBrowserExtensions

    so, 2 things

    May my app can use a non injected script, say to scrollgthe browser instance ? if not, then ooohh need to test

    So I ask the following (while listen to Im looking at gthe windows Stieve vai):

    can js detect is u use oin winformn a webview2 with Document.Window.ScrollTo(0, 0) ?

    which results in:

    In 2026, JavaScript running inside a WebView2 control can detect the fact that a scroll occurred, but it cannot inherently distinguish whether that scroll was caused by a WinForms Document.Window.ScrollTo(0, 0) command or a user’s manual action. 

    How JS Detects the Scroll

    • The scroll Event: Whenever the scroll position changes—whether programmatically via C# or manually by a user—the JavaScript scroll event fires.
    • The scrollend Event: Modern browsers (including the Edge/Chromium engine used by WebView2) support scrollend, which fires when any scroll animation completes. 

    SO, js , so youtube, cannot detect using this last method, if our app is a bot or not, so OK, camon men

    So code, to record a human real scrolls, to put on database

    UNFORTUNATELY, WebView2 does not allow to scroll without injecting JS, and the old WebBrowser does, but it is not supported on loading many websites, including youtube, that they reject tyo show, if this old browser is used.


    So, 2 opcions, use other control or scroll by moving the mouse (not emulating the scroll wheel), eyy eyyy, wait a moment, am I said Scroll wheel ??? let me checkl if I can control mouse scroll wheel ??

    I’ve got this code

    Imports System.Runtime.InteropServices
    
    Public Class Form1
        Private WithEvents Tmr As New Timer With {.Interval = 2000}
    
        Private Const MOUSEEVENTF_WHEEL As Integer = &H800 'The amount of movement is specified in mouseData.
        Private Const MOUSEEVENTF_HWHEEL As Integer = &H1000 'Not available for 2000 or XP
    
        <DllImport("user32.dll", EntryPoint:="mouse_event")> _
        Private Shared Sub mouse_event(ByVal dwFlags As UInteger, ByVal dx As Integer, ByVal dy As Integer, ByVal dwData As Integer, ByVal dwExtraInfo As UInteger)
        End Sub
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.KeyPreview = True
            Tmr.Start()
        End Sub
    
        Private Sub Tmr_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Tmr.Tick
            MouseScroll(False, 10) 'scrolls Down 10 wheel clicks
            'MouseScroll(True, 1) 'scrolls Up 1 wheel click
        End Sub
    
        Private Sub MouseScroll(ByVal up As Boolean, ByVal clicks As Integer)
            If up Then
                mouse_event(MOUSEEVENTF_WHEEL, 0, 0, (clicks * 120), 0)
            Else
                mouse_event(MOUSEEVENTF_WHEEL, 0, 0, -(clicks * 120), 0)
            End If
        End Sub
    End Class

    Does it work ?

    And now, how can I record a human natural scroll ? to later port to playback ?

    YES, in winforms, there’s the _MouseWheel Event

    say

    Private Sub WebView2_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel
    
    e.delta 
    
    End Sub

    So I need to make my own recorder / playback for

    ERROR: On the VB.bnet applicartion seems that the event handler of WebView2.MouseWheel is not fired, oops

    Victor

    Unfortunately, the current latest version of the WebView2 1.0.674-prerelease don’t support MouseWhell events too. If is possible to download and run examples from https://github.com/MicrosoftEdge/WebView2Samples.

    Hey its get fired but with no url loaded

    Lets see over the entire form, no it does not work, soo

    We have a problem MIKE

    Well not at all, as the Winform allows (yes) to catch the e.delta on scrolls, thaen I can record like if i was on the webview2, just to grab some human movements, them the question is

    Will I be able to apply those recorded events (scroll) on the webview2, lets see

    YESSSSSS, DONEEE

    It was a litle bit trciky, cause, hmnn let me show the code used

    following is the unfinished code, but does what it is needed, so to get actions based on 10 ms timer, to get 0 = no scroll, +120 = scrollup or -120 = scroll down

    VB.NET Winforms 4.7 CODE

    #Region "Imports"
    Imports System.Security.Policy
    Imports Microsoft.Web.WebView2.WinForms
    Imports System.Runtime.InteropServices
    Imports System.Runtime.CompilerServices 'Required to load low level Win DLL's
    #End Region
    Public Class ScrollRecPlay
    #Region "OS DLL"
        Private Const MOUSEEVENTF_WHEEL As Integer = &H800 'The amount of movement is specified in mouseData.
        Private Const MOUSEEVENTF_HWHEEL As Integer = &H1000 'Not available for 2000 or XP
        <DllImport("user32.dll", EntryPoint:="mouse_event")>
        Private Shared Sub mouse_event(ByVal dwFlags As UInteger, ByVal dx As Integer, ByVal dy As Integer, ByVal dwData As Integer, ByVal dwExtraInfo As UInteger)
        End Sub
    #End Region
    #Region "Variables"
        Private WithEvents TiRec As New Timer With {.Interval = 50} : Private WithEvents TiPlay As New Timer With {.Interval = 50}
        Private LastScrollDelta As Integer
    #End Region
    #Region "Buttons"
        Private Sub btnLoad_Click(sender As Object, e As EventArgs) Handles btnLoad.Click
            WebView21.Source = New Uri(txtUrl.Text)
        End Sub
        Private Sub btnRec_Click(sender As Object, e As EventArgs) Handles btnRec.Click
            TxtValues.Text = ""
            btnRec.Enabled = False : BtnStop.Enabled = True
            TiRec.Enabled = True
        End Sub
        Private Sub BtnStop_Click(sender As Object, e As EventArgs) Handles BtnStop.Click
            btnRec.Enabled = True : btnPlay.Enabled = True : TiRec.Enabled = False
        End Sub
        Private Sub btnPlay_Click(sender As Object, e As EventArgs) Handles btnPlay.Click
            'mouse_event(MOUSEEVENTF_WHEEL, 0, 0, (clicks * 120), 0)
            Me.Text = "Be Sure "
            btnPlay.Enabled = False
            TiPlay.Enabled = True
    
        End Sub
    #End Region
    #Region "Timers"
        Private Sub TiRec_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TiRec.Tick
            TxtValues.Text = TxtValues.Text & "," & LastScrollDelta
            LastScrollDelta = 0
        End Sub
        Private Sub TiPlay_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TiPlay.Tick
            MouseScroll(False, 100)
            Me.Text = "done"
        End Sub
    #End Region
    #Region "WebView2"
    
    #End Region
    #Region "Functions"
        Private Sub MouseScroll(ByVal up As Boolean, ByVal clicks As Integer)
            If up Then
                mouse_event(MOUSEEVENTF_WHEEL, 0, 0, (clicks * 120), 0)
            Else
                mouse_event(MOUSEEVENTF_WHEEL, 0, 0, -(clicks * 120), 0)
            End If
        End Sub
    
    #End Region
    
    
        Private Sub ScrollRecPlay_MouseWheel(sender As Object, e As MouseEventArgs) Handles Me.MouseWheel
            If Not btnPlay.Enabled = False Then 'to not get fired if playback (which will call to scroll)
                LastScrollDelta = e.Delta
            End If
    
        End Sub
    
    
    
    End Class

    Note: the minimum effective interval is at 50 ms, so a bit far from those 10 ms but it should be ok, I think.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *