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

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

Рейтинг



Цитата:
FiEctro писал:
Т.е. он имя класса должен возвращать?

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

Цитата:
FiEctro писал:
Т.е. это просто модуль записанный в память?

Я не знаю, откуда там указатель берётся. Скорее всего это тоже очередной хэндл. Оно так страшно выглядит, потому что в старых виндах были реальные указатели, которые потом обмазали толстенным слоем абстракций.
Как раз к Win2K это всё и оформилось в теперешнем виде.

__________________
My Projects: download page

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

Цитата:

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

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

Старое сообщение 27-04-2023 13:13
-
FiEctro
Кот Арсис

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

Рейтинг



Вот такой код получился, в данном случае для виндовс медиа плеера когда он в режиме скин хост. Вроде всё находит, а что дальше?

C++ Source Code:
1
#include <Windows.h>
2
#include <TlHelp32.h>
3
#include <iostream>
4
#include <tchar.h>
5
#include <vector>
6
#include <stdlib.h>
7
#include <psapi.h>
8
using namespace std;
9
int main()
10
{
11
  // Имя класса окна
12
  const wchar_t* className = L"WMP Skin Host";
13
 
14
  // Получение хендла окна по имени класса
15
  HWND hWnd = FindWindow(className, nullptr);
16
  if (hWnd == NULL)
17
  {
18
    std::cout << "Window not found" << std::endl;
19
    // return 0;
20
  }
21
  else
22
  {
23
    std::cout << "Window: " << hWnd << std::endl;
24
  }
25
 
26
  // Получение хендла родительского окна
27
  HWND hParent = GetParent(hWnd);
28
  if (hParent == NULL)
29
  {
30
    std::cout << "Parent window not found" << std::endl;
31
    // return 0;
32
  }
33
  else
34
  {
35
    std::cout << "Handle parent window: " << hParent << std::endl;
36
  }
37
 
38
  // Получение идентификатора процесса
39
  DWORD processId;
40
  DWORD threadId = GetWindowThreadProcessId(hWnd, &processId);
41
  if (threadId == 0 || processId == 0)
42
  {
43
    std::cout << "Not process id" << std::endl;
44
    // return 0;
45
  }
46
  else
47
  {
48
    std::cout << "Process id: " << processId << std::endl;
49
  }
50
 
51
  // Получение хендла процесса
52
  HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processId);
53
  if (hProcess == NULL)
54
  {
55
    std::cout << "Not handle process" << std::endl;
56
    // return 0;
57
  }
58
  else
59
  {
60
    std::cout << "Handle proces: " << hProcess << std::endl;
61
  }
62
 
63
 
64
  HINSTANCE hInstance = reinterpret_cast<HINSTANCE>(GetWindowLongPtr(hWnd, GWLP_HINSTANCE));
65
  if (hInstance == NULL)
66
  {
67
    std::cout << "Not handle instance module" << std::endl;
68
    CloseHandle(hProcess);
69
    return 0;
70
  }
71
  else
72
  {
73
    std::cout << "Handle instanse module: " << hInstance << std::endl;
74
  }
75
 
76
  //CloseHandle(hProcess);
77
  system("pause");
78
  return 0;
79
}


Отредактировано FiEctro 27-04-2023 в 18:18

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

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

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

Рейтинг



Ну что дальше? Дальше добавляй туда свою кнопку или что ты хотел добавить?

__________________
My Projects: download page

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

Цитата:

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

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

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

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

Рейтинг



C++ Source Code:
1
#include <Windows.h>
2
#include <psapi.h>
3
#include <iostream>
4
 
5
#pragma comment(lib, "psapi.lib")
6
using namespace std;
7
 
8
int main()
9
{
10
  // Имя класса окна
11
  const wchar_t* className = L"sflRootWindow";
12
 
13
  // Получение хендла окна по имени класса
14
  HWND hWnd = FindWindow(className, nullptr);
15
  if (hWnd == NULL)
16
  {
17
    std::cout << "Window not found" << std::endl;
18
    // return 0;
19
  }
20
  else
21
  {
22
    std::cout << "Window: " << hWnd << std::endl;
23
  }
24
 
25
  // Получение хендла родительского окна
26
  HWND hParent = GetParent(hWnd);
27
  if (hParent == NULL)
28
  {
29
    std::cout << "Parent window not found" << std::endl;
30
    // return 0;
31
  }
32
  else
33
  {
34
    std::cout << "Handle parent window: " << hParent << std::endl;
35
  }
36
 
37
  // Получение идентификатора процесса
38
  DWORD processId;
39
  DWORD threadId = GetWindowThreadProcessId(hWnd, &processId);
40
  if (threadId == 0 || processId == 0)
41
  {
42
    std::cout << "Not process id" << std::endl;
43
    // return 0;
44
  }
45
  else
46
  {
47
    std::cout << "Process id: " << processId << std::endl;
48
  }
49
 
50
  // Получение хендла процесса
51
  HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS/*PROCESS_QUERY_INFORMATION | PROCESS_VM_READ*/, FALSE, processId);
52
  if (hProcess == NULL)
53
  {
54
    std::cout << "Not handle process" << std::endl;
55
    // return 0;
56
  }
57
  else
58
  {
59
    std::cout << "Handle proces: " << hProcess << std::endl;
60
  }
61
 
62
 
63
  HINSTANCE hInstance = reinterpret_cast<HINSTANCE>(GetWindowLongPtr(hWnd, GWLP_HINSTANCE));
64
  if (hInstance == NULL)
65
  {
66
    std::cout << "Not handle instance module" << std::endl;
67
    CloseHandle(hProcess);
68
    return 0;
69
  }
70
  else
71
  {
72
    std::cout << "Handle instanse module: " << hInstance << std::endl;
73
  }
74
 
75
  // Размеры и положение кнопки
76
  int x = 50;
77
  int y = 50;
78
  int width = 150;
79
  int height = 30;
80
 
81
  // Создание кнопки
82
  HWND hButton = CreateWindowEx(0, L"BUTTON", L"Press me", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, x, y, width, height, hWnd/*hParent*/, NULL, hInstance, NULL);
83
  std::cout << "Button info: " << hButton << std::endl;
84
  if (hButton == NULL)
85
  {
86
    std::cout << "Button not created!" << std::endl;
87
    CloseHandle(hProcess);
88
    return 0;
89
  }
90
  else
91
  {
92
    std::cout << "Button created!" << std::endl;
93
  }
94
  // CloseHandle(hProcess);
95
  system("pause");
96
  return 0;
97
}


Не получается, при обращении к hButton пишет Вызвано исключение по адресу 0x00007FF8A32E2B26 (ntdll.dll) в my.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x0000000140000000. Правда тут я обращаюсь напрямую к родительскому окну, но и с дочерними такая же фигня. Если запускать отдельно от студии, оно вроде даже пишет что кнопка таки создана и даже получает её адрес. Но при этом целевое окно просто зависает и бесконечно крутится, кнопка так же не рисуется.

Добавлено 28-04-2023 в 01:20:

Заработало! Надо было всего то добавить обработчик мессаг.
C++ Source Code:
1
MSG msg;
2
 
3
// Создание кнопки
4
HWND hButton = CreateWindowEx(0, L"BUTTON", L"Press me", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, x, y, width, height, hWnd/*hParent*/, NULL, hInstance, NULL);
5
 
6
ShowWindow(hWnd, SW_SHOW);
7
UpdateWindow(hWnd);
8
while (GetMessage(&msg, NULL, 0, 0))
9
{
10
  TranslateMessage(&msg);
11
  DispatchMessage(&msg);
12
}
13
return (int)msg.wParam;


Теперь другой вопрос, кнопка рисуется под элементами, как ей задать сортировку по глубине?

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

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

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

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

Рейтинг



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


Цитата:
FiEctro писал:
кнопка рисуется под элементами

Попробуй WS_CLIPSIBLINGS.

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

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

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

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

Рейтинг



Цитата:
XaeroX писал:
Попробуй WS_CLIPSIBLINGS.


Кнопка начинает рисоваться как отдельное окно

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

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

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

Рейтинг



FiEctro ты объясни что ты хочешь в итоге получить-то?
Просто балуешься?

__________________
My Projects: download page

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

Цитата:

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

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

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

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

Рейтинг



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

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

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

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

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

Рейтинг



Цитата:
FiEctro писал:
и как сделать чтобы кнопку жмакать можно было

Да жмакать-то её несложно, а куда ты собрался отправлять команду?

__________________
My Projects: download page

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

Цитата:

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

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

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

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

Рейтинг



Цитата:
Дядя Миша писал:
Да жмакать-то её несложно, а куда ты собрался отправлять команду?


WriteProcessMemory();

Интересно, а хандл у процесса и окна которое мы ищем через класс - разные?

вместо имени окна, ловится MSCTFIME UI, ну ладно тогда костылём попробую из памяти вытащить имя окна.

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

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

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

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

Рейтинг



Ты гляди, винду запореш, как на форум ходить будешь?

__________________
My Projects: download page

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

Цитата:

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

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

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

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

Рейтинг



Цитата:
Дядя Миша писал:
Ты гляди, винду запореш, как на форум ходить будешь?


Да не страшно, она и так запорота. Всё жду новый диск. Мне интересно как получить текст заголовка окна зная модуль и инстанс окна?

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

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

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

Рейтинг



FiEctro ищи функцию в WinAPI, она должна быть.

__________________
My Projects: download page

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

Цитата:

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

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

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

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

Рейтинг



Почему некоторые элементы перезатирают кнопку (например когда кнопку перекрывает панель задач)? Её как то пересоздавать надо? Или обновлять?


Цитата:
Дядя Миша писал:
FiEctro ищи функцию в WinAPI, она должна быть.


Я нашел способ просто получать все открытые окна и сравнивать их с тем что мне нужно, не знаю насколько это корректно.
C++ Source Code:
1
BOOL CALLBACK enumWindowsProc(HWND hWnd, LPARAM lParam)
2
{
3
  std::vector<char> buffer(1024);
4
  int len = GetWindowTextA(hWnd, buffer.data(), buffer.size());
5
  if (len > 0) {
6
    std::string windowTitle(buffer.data(), len);
7
    std::string searchTitle("MyAppName");
8
    if (windowTitle.find(searchTitle) != std::string::npos) {
9
      // std::cout << windowTitle << std::endl;
10
      title = windowTitle;
11
 
12
      return FALSE;
13
    }
14
  }
15
  return TRUE;
16
}

Отредактировано FiEctro 28-04-2023 в 18:59

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

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

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

Рейтинг



Цитата:
FiEctro писал:
Её как то пересоздавать надо? Или обновлять?

WM_PAINT же.

__________________
My Projects: download page

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

Цитата:

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

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

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



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


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

Временная зона GMT. Текущее время 14:51. Новая тема    Ответить
Страницы (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