HLFX.Ru Forum Страницы (5): « 1 2 [3] 4 5 »
Показать все 72 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- Вопросы по WinAPI (https://hlfx.ru/forum/showthread.php?threadid=5934)


Отправлено Дядя Миша 27-04-2023 в 13:13:

Цитата:
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'


Отправлено FiEctro 27-04-2023 в 18:09:

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

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
}


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


Отправлено Дядя Миша 27-04-2023 в 19:29:

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

__________________
My Projects: download page

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

Цитата:

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


Отправлено FiEctro 27-04-2023 в 22:20:

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;


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

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


Отправлено XaeroX 28-04-2023 в 01:10:

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

Попробуй WS_CLIPSIBLINGS.

__________________

xaerox on Vivino


Отправлено FiEctro 28-04-2023 в 10:53:

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


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

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


Отправлено Дядя Миша 28-04-2023 в 11:52:

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

__________________
My Projects: download page

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

Цитата:

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


Отправлено FiEctro 28-04-2023 в 12:21:

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

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


Отправлено Дядя Миша 28-04-2023 в 13:12:

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

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

__________________
My Projects: download page

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

Цитата:

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


Отправлено FiEctro 28-04-2023 в 16:05:

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


WriteProcessMemory();

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

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

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


Отправлено Дядя Миша 28-04-2023 в 16:34:

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

__________________
My Projects: download page

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

Цитата:

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


Отправлено FiEctro 28-04-2023 в 17:14:

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


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

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


Отправлено Дядя Миша 28-04-2023 в 18:32:

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'


Отправлено FiEctro 28-04-2023 в 18:55:

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


Цитата:
Дядя Миша писал:
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
}

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


Отправлено Дядя Миша 28-04-2023 в 19:35:

Цитата:
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'


Временная зона GMT. Текущее время 14:26. Страницы (5): « 1 2 [3] 4 5 »
Показать все 72 сообщений этой темы на одной странице

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