 |
|

23.09.2019, 20:33
|
|
Новичок
Регистрация: 20.09.2019
Сообщений: 17
С нами:
3499389
Репутация:
1
|
|
Lua:
[CODE]
function
main
(
)
for
i
=
48
,
57
do
if
isKeyJustPressed
(
i
)
then
if
state
как перенести данное произведение на C++, isKeyPressed не работает в диалоге, GetAsyncState флудит
|
|
|

24.09.2019, 18:09
|
|
Участник форума
Регистрация: 17.12.2017
Сообщений: 110
С нами:
4423953
Репутация:
68
|
|
[QUOTE="twixjr12s"]
Lua:
[CODE]
function
main
(
)
for
i
=
48
,
57
do
if
isKeyJustPressed
(
i
)
then
if
state
C++:
[CODE]
void
checkKey
(
)
{
static
DWORD tick
=
GetTickCount
(
)
;
if
(
tick
-
GetTickCount
(
)
|
|
|

24.09.2019, 20:37
|
|
Новичок
Регистрация: 20.09.2019
Сообщений: 17
С нами:
3499389
Репутация:
1
|
|
[QUOTE="raymondique"]
я же ответил, хукни wndprochandler или юзай функцию в потоке
C++:
[CODE]
void
checkKey
(
)
{
static
DWORD tick
=
GetTickCount
(
)
;
if
(
tick
-
GetTickCount
(
)
|
|
|

25.09.2019, 00:05
|
|
Участник форума
Регистрация: 06.01.2016
Сообщений: 154
С нами:
5447649
Репутация:
28
|
|
Сообщение от twixjr12s
вообще не работает)
C++:
Код:
// 1 способ
bool
CheckPress
(
)
{
static
bool
was_pressed
=
false
;
bool
pressed
=
GetAsyncKeyState
(
key
)
&
0x8000
;
if
(
was_pressed
!=
pressed
)
{
was_pressed
=
pressed
;
if
(
pressed
)
return
true
;
}
return
false
;
}
void
CALLBACK
mainloop
(
)
{
if
(
CheckPress
(
)
)
{
// code
}
// ...
}
C++:
Код:
// 2 способ
void
CheckPressThread
(
)
{
bool
was_pressed
=
false
;
while
(
true
)
{
bool
pressed
=
GetAsyncKeyState
(
key
)
&
0x8000
;
if
(
was_pressed
!=
pressed
)
{
was_pressed
=
pressed
;
if
(
pressed
)
{
// code
}
}
Sleep
(
50
)
;
}
}
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
.
.
.
)
return
;
CreateThread
(
0
,
0
,
(
LPTHREAD_START_ROUTINE
)
&
CheckPressThread
,
0
,
0
,
0
)
;
init
=
true
;
}
}
C++:
Код:
// 3 способ
#define GTA_HWND **(HWND**)0xC97C1C
static
WNDPROC g_OriginalWndProc
=
nullptr
;
LRESULT __stdcall
WndProc
(
HWND hWnd
,
UINT msg
,
LPARAM lParam
,
WPARAM wParam
)
{
switch
(
msg
)
{
case
WM_KEYDOWN
:
case
WM_SYSKEYDOWN
:
{
if
(
wParam
==
key
)
{
// code
}
}
break
;
}
return
CallWindowProc
(
g_OriginalWndProc
,
hWnd
,
msg
,
lParam
,
wParam
)
;
}
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
.
.
.
)
return
;
g_OriginalWndProc
=
SetWindowLongPtrA
(
GTA_HWND
,
GWLP_WNDPROC
,
(
LONG_PTR
)
&
WndProc
)
;
init
=
true
;
}
}
|
|
|

25.09.2019, 18:44
|
|
Новичок
Регистрация: 20.09.2019
Сообщений: 17
С нами:
3499389
Репутация:
1
|
|
Сообщение от _Vine_
mainloop
Сообщение от _Vine_
C++:
Код:
// 1 способ
bool
CheckPress
(
)
{
static
bool
was_pressed
=
false
;
bool
pressed
=
GetAsyncKeyState
(
key
)
&
0x8000
;
if
(
was_pressed
!=
pressed
)
{
was_pressed
=
pressed
;
if
(
pressed
)
return
true
;
}
return
false
;
}
void
CALLBACK
mainloop
(
)
{
if
(
CheckPress
(
)
)
{
// code
}
// ...
}
C++:
Код:
// 2 способ
void
CheckPressThread
(
)
{
bool
was_pressed
=
false
;
while
(
true
)
{
bool
pressed
=
GetAsyncKeyState
(
key
)
&
0x8000
;
if
(
was_pressed
!=
pressed
)
{
was_pressed
=
pressed
;
if
(
pressed
)
{
// code
}
}
Sleep
(
50
)
;
}
}
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
.
.
.
)
return
;
CreateThread
(
0
,
0
,
(
LPTHREAD_START_ROUTINE
)
&
CheckPressThread
,
0
,
0
,
0
)
;
init
=
true
;
}
}
C++:
Код:
// 3 способ
#define GTA_HWND **(HWND**)0xC97C1C
static
WNDPROC g_OriginalWndProc
=
nullptr
;
LRESULT __stdcall
WndProc
(
HWND hWnd
,
UINT msg
,
LPARAM lParam
,
WPARAM wParam
)
{
switch
(
msg
)
{
case
WM_KEYDOWN
:
case
WM_SYSKEYDOWN
:
{
if
(
wParam
==
key
)
{
// code
}
}
break
;
}
return
CallWindowProc
(
g_OriginalWndProc
,
hWnd
,
msg
,
lParam
,
wParam
)
;
}
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
.
.
.
)
return
;
g_OriginalWndProc
=
SetWindowLongPtrA
(
GTA_HWND
,
GWLP_WNDPROC
,
(
LONG_PTR
)
&
WndProc
)
;
init
=
true
;
}
}
C++:
Код:
wchar_t
*
text
=
SF
->
getSAMP
(
)
->
getDialog
(
)
->
GetInputText
(
)
;
if
(
CheckPress
(
49
)
)
{
switch
(
strlen
(
(
char
*
)
SF
->
getSAMP
(
)
->
getDialog
(
)
->
GetInputText
(
)
)
)
{
case
0
:
sprintf
(
result
,
"с"
)
;
break
;
case
1
:
sprintf
(
result
,
"са"
)
;
break
;
case
2
:
sprintf
(
result
,
"сас"
)
;
break
;
case
3
:
sprintf
(
result
,
"саса"
)
;
break
;
case
3
:
sprintf
(
result
,
"сасат"
)
;
break
;
default
:
sprintf
(
result
,
"сасать"
)
;
break
;
}
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
result
)
;
}
else
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
(
char
*
)
text
)
;
Застревает на первой букве, я понимаю что это из-за этой строчки SF->getSAMP()->getDialog()->SetInputText((char*)text), но не знаю чем заменить
|
|
|

25.09.2019, 22:42
|
|
Участник форума
Регистрация: 06.01.2016
Сообщений: 154
С нами:
5447649
Репутация:
28
|
|
Сообщение от twixjr12s
C++:
Код:
wchar_t
*
text
=
SF
->
getSAMP
(
)
->
getDialog
(
)
->
GetInputText
(
)
;
if
(
CheckPress
(
49
)
)
{
switch
(
strlen
(
(
char
*
)
SF
->
getSAMP
(
)
->
getDialog
(
)
->
GetInputText
(
)
)
)
{
case
0
:
sprintf
(
result
,
"с"
)
;
break
;
case
1
:
sprintf
(
result
,
"са"
)
;
break
;
case
2
:
sprintf
(
result
,
"сас"
)
;
break
;
case
3
:
sprintf
(
result
,
"саса"
)
;
break
;
case
3
:
sprintf
(
result
,
"сасат"
)
;
break
;
default
:
sprintf
(
result
,
"сасать"
)
;
break
;
}
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
result
)
;
}
else
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
(
char
*
)
text
)
;
Застревает на первой букве, я понимаю что это из-за этой строчки SF->getSAMP()->getDialog()->SetInputText((char*)text), но не знаю чем заменить
Попробуй использовать getDialog()->pText вместо Get/SetInputText
|
|
|

26.09.2019, 11:35
|
|
Постоянный
Регистрация: 05.03.2014
Сообщений: 626
С нами:
6415078
Репутация:
163
|
|
Ошибка пикрелейтед, sf-plugin. Возникает от случая к случаю. Обычно после 10-20 минут работы цикла в отдельном потоке. Раскрыть код, увы, не могу. Могу лишь подчеркнуть, что это обычный бесконечный цикл, в котором вызываются некоторые функции. Есть ли какие-нибудь решения этого недоразумения, за исключением переноса цикла в мэйнлуп?

|
|
|

26.09.2019, 13:00
|
|
Познавший АНТИЧАТ
Регистрация: 16.03.2017
Сообщений: 1,626
С нами:
4821087
Репутация:
133
|
|
Сообщение от astap_
Ошибка пикрелейтед, sf-plugin. Возникает от случая к случаю. Обычно после 10-20 минут работы цикла в отдельном потоке. Раскрыть код, увы, не могу. Могу лишь подчеркнуть, что это обычный бесконечный цикл, в котором вызываются некоторые функции. Есть ли какие-нибудь решения этого недоразумения, за исключением переноса цикла в мэйнлуп?

Через сампфункс нельзя создавать потоки вообще, колхозь с таймерами
|
|
|

26.09.2019, 14:29
|
|
Постоянный
Регистрация: 14.11.2017
Сообщений: 319
С нами:
4472205
Репутация:
163
|
|
Сообщение от astap_
Ошибка пикрелейтед, sf-plugin. Возникает от случая к случаю. Обычно после 10-20 минут работы цикла в отдельном потоке. Раскрыть код, увы, не могу. Могу лишь подчеркнуть, что это обычный бесконечный цикл, в котором вызываются некоторые функции. Есть ли какие-нибудь решения этого недоразумения, за исключением переноса цикла в мэйнлуп?

Ты создаёшь поток в mainloop? Если да, то это не лучший вариант, создавай его в DLL_PROCESS_ATTACH
|
|
|

26.09.2019, 14:32
|
|
Постоянный
Регистрация: 05.03.2014
Сообщений: 626
С нами:
6415078
Репутация:
163
|
|
Сообщение от ALF
Ты создаёшь поток в mainloop? Если да, то это не лучший вариант, создавай его в DLL_PROCESS_ATTACH
в теле команды. спасибо, буду пробовать.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|