Cita de: Eleкtro en 15 Septiembre 2020, 15:31 PM
¿Pero lo estás jugando a pantalla completa dedicada, o ventana sin bordes?...
De todas formas si ese problema es tal y como dices, entonces lo más simple para prevenirlo sería desarrollar un cheat sin interfaz gráfica y así evitar el problema. Si no puedes vencer a tu enemigo, acomódate a él. xD
También puedes probar a utilizar la función de Windows 'SetWindowLongPtr' sobre la ventana de tu aplicación:
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowlongptra
con la combinación de estilos extendidos de ventana: WS_EX_TOPMOST + WS_EX_NOACTIVATE:
https://docs.microsoft.com/en-us/windows/win32/winmsg/extended-window-styles
Teoricamente con esa combinación de estilos puedes superponer una ventana sobre las demás (top most) sin activar el foco de entrada de dicha ventana.
Gracias bro, como siempre este es el único lugar donde siempre logro resolver completamente mis dudas gracias ti.
Como siempre tu conocimiento en .Net me dejaron boca abierta.... he quedado como que wtf.
Has dado justo en el clavo. justo lo que necesitaba. Así lo resolví :
Funciona Perfectamente. Se puede interactuar con el cheat encima del juego y no perder el foco de la ventana del juego.
Código (vbnet) [Seleccionar]
#Region " No Windows Focus "
Protected Overrides ReadOnly Property ShowWithoutActivation As Boolean
Get
Return True
End Get
End Property
Private Const WS_EX_TOPMOST As Integer = &H8
Private Const WS_THICKFRAME As Integer = &H40000
Private Const WS_CHILD As Integer = &H40000000
Private Const WS_EX_NOACTIVATE As Integer = &H8000000
Private Const WS_EX_TOOLWINDOW As Integer = &H80
Protected Overrides ReadOnly Property CreateParams As CreateParams
Get
Dim createParamsA As CreateParams = MyBase.CreateParams
createParamsA.ExStyle = createParamsA.ExStyle Or WS_EX_TOPMOST Or WS_EX_NOACTIVATE Or WS_EX_TOOLWINDOW
Return createParamsA
End Get
End Property
#End Region
Citar
No se a que clase te refieres, pero esto te debería servir para suspender y reanudar el proceso:
https://foro.elhacker.net/net_c_vbnet_asp/libreria_de_snippets_para_vbnet_compartan_aqui_sus_snippets-t378770.0.html;msg1859297#msg1859297
Aquí te dejo una actualización del código:
Por alguna razon tu clase no me funcionaba, pero esta actualizacion de codigo fuciona perfectamente. lo malo es q el juego se desconecta del servidor. y pos pausar el proceso tampoco funciona.
Este era mi actual codigo para pausar y reanudar procesos :
ProcessPausator.vb
Código (vbnet) [Seleccionar]
Public Class ProcessPausator
#Region " Pinvoke "
Public Declare Function OpenThread Lib "kernel32.dll" (ByVal dwDesiredAccess As ThreadAccess, ByVal bInheritHandle As Boolean, ByVal dwThreadId As UInteger) As IntPtr
Public Declare Function SuspendThread Lib "kernel32.dll" (ByVal hThread As IntPtr) As UInteger
Public Declare Function ResumeThread Lib "kernel32.dll" (ByVal hThread As IntPtr) As UInteger
Public Declare Function CloseHandle Lib "kernel32.dll" (ByVal hHandle As IntPtr) As Boolean
#End Region
#Region " Enum "
Public Enum ThreadAccess As Integer
TERMINATE = (&H1)
SUSPEND_RESUME = (&H2)
GET_CONTEXT = (&H8)
SET_CONTEXT = (&H10)
SET_INFORMATION = (&H20)
QUERY_INFORMATION = (&H40)
SET_THREAD_TOKEN = (&H80)
IMPERSONATE = (&H100)
DIRECT_IMPERSONATION = (&H200)
End Enum
#End Region
Public Shared Function PauseThread(ByRef Process_Name As String) As Boolean
If Process_Name.ToLower.EndsWith(".exe") Then Process_Name = Process_Name.Substring(0, Process_Name.Length - 4)
Dim proc() As Process = Process.GetProcessesByName(Process_Name)
If Not proc.Length = 0 Then
SuspendProcess(proc(0))
Return True
End If
Return False
End Function
Public Shared Function ResumeThread(ByRef Process_Name As String) As Boolean
If Process_Name.ToLower.EndsWith(".exe") Then Process_Name = Process_Name.Substring(0, Process_Name.Length - 4)
Dim proc() As Process = Process.GetProcessesByName(Process_Name)
If Not proc.Length = 0 Then
ResumeProcess(proc(0))
Return True
End If
Return False
End Function
Private Shared Sub SuspendProcess(ByVal process As System.Diagnostics.Process)
For Each t As ProcessThread In process.Threads
Dim th As IntPtr = OpenThread(ThreadAccess.SUSPEND_RESUME, False, t.Id)
If Not th = IntPtr.Zero Then
SuspendThread(th)
CloseHandle(th)
End If
Next
End Sub
Private Shared Sub ResumeProcess(ByVal process As System.Diagnostics.Process)
For Each t As ProcessThread In process.Threads
Dim th As IntPtr = OpenThread(ThreadAccess.SUSPEND_RESUME, False, t.Id)
If Not th = IntPtr.Zero Then
ResumeThread(th)
CloseHandle(th)
End If
Next
End Sub
End Class
No es mucho pero es trabajo honesto .... pero si lo comparo a tu code.....
PD: Que opinas de mi mejor proyecto , que he hecho hasta ahora? .
es mi obra maestra : https://github.com/DestroyerDarkNess/DestroyerProtection