HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Вопросы по WinAPI
GetAsyncKeyState и все-все-все
Страницы (5): « 1 2 3 [4] 5 »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12893
Возраст: 32

Рейтинг



Как работает WindowProc? Как он вообще вызывается?

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!

Сообщить модератору | | IP: Записан
Сообщение: 214205

Старое сообщение 28-04-2023 20:35
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32204
Нанёс повреждений: 392 ед.

Рейтинг



По дефолту он создаётся для класса. Но можно его переопределить для каждого окна. Вызывается он вот как раз то ли в GetMessage то ли в TranslateMessage, непомню точно.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 214207

Старое сообщение 29-04-2023 05:09
-
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12893
Возраст: 32

Рейтинг



Как получить хандл конкретного дочернего окна?

C++ Source Code:
1
BOOL CALLBACK EnumChildProc(HWND childHwnd, LPARAM lParam)
2
{
3
  cout << "Child Window: " << childHwnd << endl;
4
  return TRUE;
5
}


Они каждый раз разные и их позиция тоже, а имя класса у них у всех одинаковое.

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!

Сообщить модератору | | IP: Записан
Сообщение: 214209

Старое сообщение 29-04-2023 08:54
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34517
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Что-то я уже совсем утерял нить - причём тут GetAsyncKeyState?

__________________

Сообщить модератору | | IP: Записан
Сообщение: 214210

Старое сообщение 29-04-2023 14:07
-
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12893
Возраст: 32

Рейтинг



Цитата:
XaeroX писал:
Что-то я уже совсем утерял нить - причём тут GetAsyncKeyState?



C ним уже разобрался. Сейчас просто ковыряю винапи. С дочерними окнами тоже разобрался.

Вопрос всё с обработчиком кнопок:
C++ Source Code:
1
LRESULT CALLBACK ButtonProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
2
{
3
  std::cout << "ButtonProc" << std::endl;
4
  switch (msg)
5
  {
6
  case WM_COMMAND:
7
      if (HIWORD(wParam) == BN_CLICKED && hwnd == hButton)
8
      {
9
        std::cout << "Button pressed" << std::endl;
10
      }
11
    break;
12
  default:
13
      return DefWindowProc(hwnd, msg, wParam, lParam);
14
  }
15
  return 0;
16
}



и собственно как я создаю саму кнопку:

C++ Source Code:
1
MSG msg;
2
int ID_BUTTON = 1;
3
int x = 0;
4
int y = 0;
5
int width = 120;
6
int height = 30;
7
 
8
hButton = CreateWindowEx(0, L"BUTTON", L"Press me", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, x, y, width, height, chWnd1/*hParent*/, (HMENU)ID_BUTTON, hInstance, NULL);
9
 
10
SetWindowLongPtr(hButton, GWLP_WNDPROC, (LONG_PTR)ButtonProc);
11
 
12
while (GetMessage(&msg, NULL, 0, 0))
13
{
14
 
15
 
16
  TranslateMessage(&msg);
17
  DispatchMessage(&msg);
18
}
19
return (int)msg.wParam;
20
 


Если использую SetWindowLongPtr(hButton,GWLP_WNDPROC, (LONG_PTR)ButtonProc); то кнопка пропадает, но зато вызывается обработчик ButtonProc когда я навожу на него мышь. ЧЯДНТ?

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!

Отредактировано FiEctro 29-04-2023 в 16:01

Сообщить модератору | | IP: Записан
Сообщение: 214211

Старое сообщение 29-04-2023 15:50
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34517
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Может, тебе надо сначала получить старый обработчик, и потом вызывать его в твоём вместо DefWindowProc?

__________________

Сообщить модератору | | IP: Записан
Сообщение: 214212

Старое сообщение 29-04-2023 16:08
-
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12893
Возраст: 32

Рейтинг



Цитата:
XaeroX писал:
Может, тебе надо сначала получить старый обработчик, и потом вызывать его в твоём вместо DefWindowProc?



Что подразумевается под старым обработчиком?

Если я правильно понял то это:
lpfnOldWndProc = (WNDPROC)GetWindowLongPtr(hWnd, GWLP_WNDPROC);

и в обработчике вызывать это:
CallWindowProc(lpfnOldWndProc, hwnd, msg, wParam, lParam);

ну ничего не произошло интересного, lpfnOldWndProc получает нули, как от родителя, так и от дочерних, ButtonProc при этом начинает вызываться бесконечно.

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!

Сообщить модератору | | IP: Записан
Сообщение: 214213

Старое сообщение 29-04-2023 18:22
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34517
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
FiEctro писал:
hWnd

hButton

__________________

Сообщить модератору | | IP: Записан
Сообщение: 214214

Старое сообщение 29-04-2023 18:28
-
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12893
Возраст: 32

Рейтинг



Кнопка вроде как начала рисоваться и получает адрес отличный от нуля, в остальном поведение схожее с DefWindowProc, т.е. при наведении вызывается ButtonProc, но при клике на кнопку ничего не происходит.

C++ Source Code:
1
LRESULT CALLBACK ButtonProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
2
{
3
  //   std::cout << "ButtonProc" << std::endl;
4
  switch (msg)
5
  {
6
  case WM_COMMAND:
7
      if (HIWORD(wParam) == BN_CLICKED && hwnd == hButton)
8
      {
9
        std::cout << "Button pressed" << std::endl;
10
      }
11
    break;
12
  default:
13
      // return 0;
14
    return  CallWindowProc(lpfnOldWndProc, hwnd, msg, wParam, lParam);
15
  }
16
  return 0;
17
}


В функции int main() консольного приложения:
C++ Source Code:
1
MSG msg;
2
int x = 0;
3
int y = 0;
4
int width = 120;
5
int height = 30;
6
hButton = CreateWindowEx(0, L"BUTTON", L"Press me", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, x, y, width, height, chWnd1/*hParent*/, (HMENU)ID_BUTTON, hInstance, NULL);
7
lpfnOldWndProc = (WNDPROC)GetWindowLongPtr(hButton, GWLP_WNDPROC);
8
 
9
std::cout << "Button pointer: " << lpfnOldWndProc << std::endl;
10
 
11
SetWindowLongPtr(hButton, GWLP_WNDPROC, (LONG_PTR)ButtonProc);
12
 
13
 
14
while (GetMessage(&msg, NULL, 0, 0))
15
{
16
  TranslateMessage(&msg);
17
  DispatchMessage(&msg);
18
}
19
return (int)msg.wParam;




UPD: Вроде как отлавливает нажатия, при жмакании левой кнопкой мыши на мою кнопку значения внутри ButtonProc выдаёт такие:
msg: 243 wParam: 1 lParam: 0
чтобы это не значило (хотя иногда wParam бывает равен и 0), пока не знаю как правильно в винапи их отследить, очередные магические числа. Надеюсь они не меняются от запуска к запуску.

Вот небольшой лог:
C++ Source Code:
1
MSG: 126 wParam: 32 lParam: 70780800
2
MSG: 26 wParam: 42 lParam: 612296422360
3
MSG: 26 wParam: 46 lParam: 612296422360
4
MSG: 15 wParam: 0 lParam: 0
5
MSG: 133 wParam: 1 lParam: 0
6
MSG: 20 wParam: 18446744073155981989 lParam: 0
7
MSG: 15 wParam: 0 lParam: 0
8
MSG: 133 wParam: 1 lParam: 0
9
MSG: 20 wParam: 18446744073155981989 lParam: 0
10
MSG: 15 wParam: 0 lParam: 0
11
MSG: 133 wParam: 1 lParam: 0
12
MSG: 20 wParam: 18446744072266791344 lParam: 0
13
MSG: 15 wParam: 0 lParam: 0
14
MSG: 133 wParam: 1 lParam: 0
15
MSG: 20 wParam: 18446744072266791344 lParam: 0
16
MSG: 15 wParam: 0 lParam: 0
17
MSG: 133 wParam: 1 lParam: 0
18
MSG: 20 wParam: 18446744072266791344 lParam: 0
19
MSG: 15 wParam: 0 lParam: 0
20
MSG: 133 wParam: 1 lParam: 0
21
MSG: 20 wParam: 18446744071847359961 lParam: 0
22
MSG: 132 wParam: 0 lParam: 66846847
23
MSG: 32 wParam: 1118670 lParam: 33554433
24
MSG: 512 wParam: 0 lParam: 1376375
25
MSG: 132 wParam: 0 lParam: 66650236
26
MSG: 32 wParam: 1118670 lParam: 33554433
27
MSG: 512 wParam: 0 lParam: 1179764
28
MSG: 132 wParam: 0 lParam: 66584696
29
MSG: 32 wParam: 1118670 lParam: 33554433
30
MSG: 512 wParam: 0 lParam: 1114224
31
MSG: 15 wParam: 0 lParam: 0
32
MSG: 133 wParam: 1 lParam: 0
33
MSG: 20 wParam: 18446744072266791344 lParam: 0
34
MSG: 132 wParam: 0 lParam: 66388085
35
MSG: 32 wParam: 1118670 lParam: 33554433
36
MSG: 512 wParam: 0 lParam: 917613
37
MSG: 132 wParam: 0 lParam: 66257009
38
MSG: 32 wParam: 1118670 lParam: 33554433
39
MSG: 512 wParam: 0 lParam: 786537
40
MSG: 132 wParam: 0 lParam: 66257006
41
MSG: 32 wParam: 1118670 lParam: 33554433
42
MSG: 512 wParam: 0 lParam: 786534
43
MSG: 132 wParam: 0 lParam: 66191468
44
MSG: 32 wParam: 1118670 lParam: 33554433
45
MSG: 512 wParam: 0 lParam: 720996
46
MSG: 132 wParam: 0 lParam: 66191467
47
MSG: 32 wParam: 1118670 lParam: 33554433
48
MSG: 512 wParam: 0 lParam: 720995
49
MSG: 132 wParam: 0 lParam: 66125930
50
MSG: 32 wParam: 1118670 lParam: 33554433
51
MSG: 512 wParam: 0 lParam: 655458
52
MSG: 132 wParam: 0 lParam: 66125929
53
MSG: 32 wParam: 1118670 lParam: 33554433
54
MSG: 512 wParam: 0 lParam: 655457
55
MSG: 132 wParam: 0 lParam: 66125928
56
MSG: 32 wParam: 1118670 lParam: 33554433
57
MSG: 512 wParam: 0 lParam: 655456
58
MSG: 132 wParam: 0 lParam: 66125928
59
MSG: 33 wParam: 2364392 lParam: 33619969
60
MSG: 32 wParam: 1118670 lParam: 33619969
61
MSG: 513 wParam: 1 lParam: 655456
62
MSG: 7 wParam: 2364392 lParam: 0
63
MSG: 243 wParam: 1 lParam: 0
64
MSG: 514 wParam: 0 lParam: 655456
65
MSG: 243 wParam: 0 lParam: 0
66
MSG: 132 wParam: 0 lParam: 66125928
67
MSG: 32 wParam: 1118670 lParam: 33554433
68
MSG: 512 wParam: 0 lParam: 655456
69
MSG: 132 wParam: 0 lParam: 66125928
70
MSG: 32 wParam: 1118670 lParam: 33554433
71
MSG: 512 wParam: 0 lParam: 655456
72
MSG: 132 wParam: 0 lParam: 66125928
73
MSG: 33 wParam: 2364392 lParam: 33619969
74
MSG: 32 wParam: 1118670 lParam: 33619969
75
MSG: 515 wParam: 1 lParam: 655456
76
MSG: 243 wParam: 1 lParam: 0
77
MSG: 512 wParam: 1 lParam: 655456
78
MSG: 243 wParam: 1 lParam: 0
79
MSG: 514 wParam: 0 lParam: 655456
80
MSG: 243 wParam: 0 lParam: 0
81
MSG: 132 wParam: 0 lParam: 66125928
82
MSG: 32 wParam: 1118670 lParam: 33554433
83
MSG: 512 wParam: 0 lParam: 655456
84
MSG: 132 wParam: 0 lParam: 66125928
85
MSG: 33 wParam: 2364392 lParam: 33619969
86
MSG: 32 wParam: 1118670 lParam: 33619969
87
MSG: 513 wParam: 1 lParam: 655456
88
MSG: 243 wParam: 1 lParam: 0
89
MSG: 514 wParam: 0 lParam: 655456
90
MSG: 243 wParam: 0 lParam: 0
91
MSG: 132 wParam: 0 lParam: 66125928
92
MSG: 32 wParam: 1118670 lParam: 33554433
93
MSG: 512 wParam: 0 lParam: 655456
94
MSG: 132 wParam: 0 lParam: 66125928
95
MSG: 33 wParam: 2364392 lParam: 33619969
96
MSG: 32 wParam: 1118670 lParam: 33619969
97
MSG: 515 wParam: 1 lParam: 655456
98
MSG: 243 wParam: 1 lParam: 0
99
MSG: 514 wParam: 0 lParam: 655456
100
MSG: 243 wParam: 0 lParam: 0
101
MSG: 132 wParam: 0 lParam: 66125928
102
MSG: 32 wParam: 1118670 lParam: 33554433
103
MSG: 512 wParam: 0 lParam: 655456
104
MSG: 132 wParam: 0 lParam: 66125927
105
MSG: 32 wParam: 1118670 lParam: 33554433
106
MSG: 512 wParam: 0 lParam: 655455
107
MSG: 132 wParam: 0 lParam: 66125930
108
MSG: 32 wParam: 1118670 lParam: 33554433
109
MSG: 512 wParam: 0 lParam: 655458
110
MSG: 132 wParam: 0 lParam: 66125938
111
MSG: 32 wParam: 1118670 lParam: 33554433
112
MSG: 512 wParam: 0 lParam: 655466
113
MSG: 132 wParam: 0 lParam: 66257023
114
MSG: 32 wParam: 1118670 lParam: 33554433
115
MSG: 512 wParam: 0 lParam: 786551
116
MSG: 15 wParam: 0 lParam: 0
117
MSG: 133 wParam: 1 lParam: 0
118
MSG: 20 wParam: 151075455 lParam: 0
119
MSG: 15 wParam: 0 lParam: 0
120
MSG: 133 wParam: 1 lParam: 0
121
MSG: 20 wParam: 151075455 lParam: 0
122
MSG: 8 wParam: 0 lParam: 0
123
MSG: 15 wParam: 0 lParam: 0



UPD: В общем какая то жуть. В инете и справке всё неправильно. Пересоздаю кнопку в case WM_ERASEBKGND: и только тогда она начинает обрабатывать события, и более менее не затирается другими элементами. Но иногда мерзко мерцает.
А вот WM_PAINT рисуется вообще только когда мышка наведена на дочернее окно , в остальных случаях он кнопку вообще не рисует.

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!

Отредактировано FiEctro 29-04-2023 в 19:55

Сообщить модератору | | IP: Записан
Сообщение: 214215

Старое сообщение 30-04-2023 00:13
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32204
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
FiEctro писал:
В инете и справке всё неправильно

Справка не предполагает ситуации, что ты подмешиваешь свои кнопки в чужое приложение

Добавлено 30-04-2023 в 08:48:

Но вообще - судя по тому, чем ты занимаешься, я был прав, когда запланировал архитектуру редактора со сменным пользовательским интерфейсом на скриптовом языке. Пользователь обязательно захочет добавить в любимое приложение полезных кнопок, менюшек или комманд.
Главное чтобы сам редактор позволял ему это сделать.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 214216

Старое сообщение 30-04-2023 05:48
-
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12893
Возраст: 32

Рейтинг



В целом разобрался корень всех проблем был в неправильном стиле дочернего окна. Нужно было принудительно задать ему WS_CLIPCHILDREN.

C++ Source Code:
LONG_PTR style = GetWindowLongPtr(chWnd1, GWL_STYLE);
style |= WS_CLIPCHILDREN;
SetWindowLongPtr(chWnd1, GWL_STYLE, style);


В написал целом более менее стабильный код, наверное не очень правильный, но в моём случае сойдёт, рисует кнопки, не тормозит, не мерацает, не затирается элементами, не зависает и отправляет события.

C++ Source Code:
1
bool makebuttons = true;
2
LRESULT CALLBACK ButtonProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
3
{
4
  //std::cout << "MSG: " << msg <<" wParam: " << wParam << " lParam: " << lParam << std::endl;
5
 
6
  int ID_BUTTON1 = 100;
7
  int ID_BUTTON2 = 101;
8
 
9
  static HWND hButton1 = NULL;
10
  static HWND hButton2 = NULL;
11
 
12
  if (makebuttons)
13
  {
14
    msg = 0x007e; // Принудительно вызываем WM_DISPLAYCHANGE для Windows 7
15
    std::cout << "Make button by: " << msg << std::endl;
16
    makebuttons = false;
17
  }
18
 
19
  switch (msg)
20
  {
21
  case WM_DISPLAYCHANGE:
22
    {
23
      hButton1 = CreateWindowEx(0, L"BUTTON", L"Button 1", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 30, 0, 120, buttonHeight1, hwnd, (HMENU)ID_BUTTON1, NULL, NULL);
24
      hButton2 = CreateWindowEx(0, L"BUTTON", L"Button 2", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 180, 0, 120, buttonHeight1, hwnd, (HMENU)ID_BUTTON2, NULL, NULL);
25
      return 0;
26
    }
27
 
28
  case WM_ERASEBKGND:
29
    {
30
      return 1;
31
    }
32
 
33
  case WM_PAINT:
34
    {
35
      PAINTSTRUCT ps;
36
      HDC hdc = BeginPaint(hwnd, &ps);
37
      FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_HIGHLIGHT + 1));
38
      EndPaint(hwnd, &ps);
39
      ShowWindow(hButton1, SW_SHOW);
40
      ShowWindow(hButton2, SW_SHOW);
41
      return 0;
42
    }
43
 
44
  case WM_COMMAND:
45
    {
46
      if (LOWORD(wParam) == ID_BUTTON1 && HIWORD(wParam) == BN_CLICKED)
47
      {
48
        std::cout << "Button 1 pressed" << std::endl;
49
      }
50
      else if (LOWORD(wParam) == ID_BUTTON2 && HIWORD(wParam) == BN_CLICKED)
51
      {
52
        std::cout << "Button 2 pressed" << std::endl;
53
      }
54
 
55
      return 0;
56
    }
57
 
58
  case WM_DESTROY:
59
    {
60
      PostQuitMessage(0);
61
    }
62
 
63
  default:
64
    {
65
      return CallWindowProc(lpfnOldWndProc, hwnd, msg, wParam, lParam);
66
    }
67
  }
68
 
69
  return 0;
70
}

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!

Отредактировано FiEctro 30-04-2023 в 14:03

Сообщить модератору | | IP: Записан
Сообщение: 214220

Старое сообщение 30-04-2023 13:59
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32204
Нанёс повреждений: 392 ед.

Рейтинг



А как ты собрался отправлять команды стороннему приложению-то?
У него есть какое-то публичное API?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 214222

Старое сообщение 30-04-2023 14:26
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34517
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Дядя Миша
Может быть, там есть обработчик WM_COPYDATA? Ну то есть по сути простейший IPC API.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 214223

Старое сообщение 30-04-2023 14:57
-
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12893
Возраст: 32

Рейтинг



Цитата:
Дядя Миша писал:
А как ты собрался отправлять команды стороннему приложению-то?
У него есть какое-то публичное API?


Есть такая программа CheatEngine она делает дамп памяти любого твоего приложения (ну то есть вообще любого), и позволяет сканировать эту самую память на изменение переменных в реальном времени. Собственно зная изначальное значение ты можешь найти нужный адрес в памяти и приплюсовать его к модулю этого же приложения, тогда ты всегда надёжно сможешь к нему обращаться через ReadProcessMemory, и изменять его значение через WriteProcessMemory.

ReadProcessMemory(phandle, (LPVOID)(module_target_app + target_address), &myVar, sizeof(myVar), NULL);

Естественно память может выделяться и во время выполнения, это более сложно. Я пока работаю с чисто уже выделенными при старте адресами.

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!

Отредактировано FiEctro 30-04-2023 в 15:42

Сообщить модератору | | IP: Записан
Сообщение: 214224

Старое сообщение 30-04-2023 15:33
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34517
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


FiEctro
А, ну так любые трейнеры работают.
Проблема в том, что с каждой новой версией программы адреса могут измениться. Ненадёжный способ.

Добавлено 30-04-2023 в 13:30:

К тому же для WriteProcessMemory тебе скорее всего понадобятся привилегии администратора.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 214225

Старое сообщение 30-04-2023 17:30
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 16:17. Новая тема    Ответить
Страницы (5): « 1 2 3 [4] 5 »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Вопросы по WinAPI
GetAsyncKeyState и все-все-все
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024