Показать сообщение отдельно

  #57  
Старый 02.11.2024, 17:57
Charmant
Познающий
Регистрация: 08.03.2024
Сообщений: 89
С нами: 1150633

Репутация: 231
По умолчанию

Цитата:
Сообщение от BIT_hack  

Активное загруженное окно можно получить и так HWND GetForegroundWindow();
Пока ищу способ может кто-то еще подскажет)

Попустил твое сообщение подскажи как использовать UNetworkHandler::Tick() (?Tick@UNetworkHandler@@UAEXM@Z) Из него нужно получить какие-то параметры?
У клиента есть функция проверки состояния, которая активно используется в nwindow.dll - UL2ConsoleWnd::GetState

Можно воспользоваться этим знанием вот так:

Цитата:
Сообщение от Спойлер  


C++:


Код:
namespace
{
enum
L2ConsoleState
{
Loading
=
0
,
Unknown
=
1
,
Login
=
2
,
CharCreate
=
3
,
CharSelect
=
4
,
InGame
=
5
}
;
class
UL2ConsoleWnd
{
}
;
UL2ConsoleWnd
*
UL2ConsoleWndPtr
=
nullptr
;
uintptr_t consoleOffset
=
0x3663bc
;
// для IL клиента
}
DWORD WINAPI
init
(
LPVOID lpParameter
)
{
HMODULE hNwindowModule
=
nullptr
;
while
(
hNwindowModule
==
nullptr
)
{
hNwindowModule
=
GetModuleHandleW
(
L
"nwindow.dll"
)
;
Sleep
(
1000
)
;
}
// получение валидного указателя на UL2ConsoleWnd
uintptr_t pUL2ConsoleWnd
=
(
reinterpret_cast

(
hNwindowModule
)
)
+
consoleOffset
;
while
(
UL2ConsoleWndPtr
==
nullptr
)
{
UL2ConsoleWndPtr
=
*
reinterpret_cast

(
pUL2ConsoleWnd
)
;
Sleep
(
300
)
;
}
// получение адреса по которому записывается текущее состояние
L2ConsoleState
*
statePtr
=
reinterpret_cast

(
UL2ConsoleWndPtr
+
0x38
)
;
// просто пример получения текущего состояния в цикле
// можно сделать отдельной функцией и получать состояние по необходимости
while
(
true
)
{
L2ConsoleState currentState
=
*
statePtr
;
switch
(
currentState
)
{
case
L2ConsoleState
::
Loading
:
MessageBoxW
(
NULL
,
L
"загрузка"
,
L
"L2ConsoleState"
,
MB_OK
)
;
break
;
case
L2ConsoleState
::
Login
:
MessageBoxW
(
NULL
,
L
"лобби"
,
L
"L2ConsoleState"
,
MB_OK
)
;
break
;
case
L2ConsoleState
::
CharCreate
:
MessageBoxW
(
NULL
,
L
"cоздание чара"
,
L
"L2ConsoleState"
,
MB_OK
)
;
break
;
case
L2ConsoleState
::
CharSelect
:
MessageBoxW
(
NULL
,
L
"выбор чара"
,
L
"L2ConsoleState"
,
MB_OK
)
;
break
;
case
L2ConsoleState
::
InGame
:
MessageBoxW
(
NULL
,
L
"в игре"
,
L
"L2ConsoleState"
,
MB_OK
)
;
break
;
}
Sleep
(
5000
)
;
}
return
0
;
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD  ul_reason_for_call
,
LPVOID lpReserved
)
{
switch
(
ul_reason_for_call
)
{
case
DLL_PROCESS_ATTACH
:
DisableThreadLibraryCalls
(
hModule
)
;
{
HANDLE hThread
=
CreateThread
(
NULL
,
0
,
init
,
NULL
,
0
,
NULL
)
;
if
(
hThread
!=
NULL
)
{
CloseHandle
(
hThread
)
;
}
}
break
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_DETACH
:
case
DLL_PROCESS_DETACH
:
break
;
}
return
TRUE
;
}
 
Ответить с цитированием