Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/89: Рейтинг темы: голосов - 89, средняя оценка - 4.90
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
1

Получение дескриптора консольного окна

07.01.2014, 23:31. Показов 16278. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем еще раз!Хочу заморочиться рисовать в консоле с помощью winapi,но перед этим мне нужно хотя бы получить дескриптор окна консоли,что у меня и не выходит(
Получить дескриптор я пробую с помощью функции FindWindow(...),куда место первого параметра(название класса окна) я передаю NULL, а место второго параметра(заголовок самой программы) я передаю заголовок окна консоли,полученный с помощью функции GetConsoleTitle(...).Сколько не пробовал,дескриптор получить я не могу(Пробовал и изменить заголовок консоли с помощью функции SetConsoleTitle(...) и поместить место второго параметра новый заголовок программы...все равно ничего не выходит(
Помогите пожалуйста,в чем проблема может возникать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.01.2014, 23:31
Ответы с готовыми решениями:

Получение дескриптора экранного буфера консоли дочернего процесса
Здравствуйте. Можно ли и если можно , то как Получить дескриптор экранного буфера консоли дочернего...

Захват дескриптора (handle) чужого окна
Можно ли из моей программы управлять окном которое создано другим приложением (закрывать,...

Получение списка пользователей (консольного и rdp-сеансов)
собственно, необходимо получить список активных пользователей у которых консольный сеанс а так же...

Управлять событиями окна консольного приложения
Можно ли как-то ловить события окна консольного приложения ? Конкретно нужно отлавливаться отсылку...

16
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
07.01.2014, 23:35 2
http://msdn.microsoft.com/en-u... s.85).aspx
0
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
08.01.2014, 01:09 3
C++
1
2
3
4
5
6
7
8
9
10
11
HWND GetConsoleHwnd()
{
    HWND hwnd;
    wchar_t Old[200];
    GetConsoleTitle(Old,200);
    SetConsoleTitle(L"Console");
    Sleep(40);
    hwnd=FindWindow(NULL, L"Console");
    SetConsoleTitle(Old);
    return hwnd;
}
Сам занимаюсь рисованием в консоли средствами WinAPI)
Вот этой функцией получаю дескриптор консоли.
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
08.01.2014, 02:20 4
MSDN: GetConsoleWindow function
0
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
09.01.2014, 00:00  [ТС] 5
Как не пробовал вашими методами,всё тоже самое...дескриптор не получаю.Он в hwnd мой помешает вот такую хрень:
0х001202ce{unused=???} <Unable to read memory>
Как не пробую,ничего не получается.Работаю в VS C++ ,создаю проект как консольное приложение...если это поможет решить проблему
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
09.01.2014, 00:01 6
Цитата Сообщение от Bretbas Посмотреть сообщение
Как не пробовал вашими методами,всё тоже самое...дескриптор не получаю.
код то покажите, если он не засекречен, конечно
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
09.01.2014, 00:09 7
вот попробуйте зажмите левую мышку и поелозте по окну:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <windows.h>
 
int main()
{
  HWND hwnd = GetConsoleWindow();
 
  const unsigned pressedMask = 1u << sizeof(SHORT) * 8;
  while (true)
  {
    const unsigned state = static_cast<unsigned>(GetKeyState(VK_LBUTTON));
    if (pressedMask & state) // if pressed
    {
      POINT cursorPos;
      GetCursorPos(&cursorPos);
      ScreenToClient(hwnd, &cursorPos);
      SetPixel(GetDC(hwnd), cursorPos.x, cursorPos.y, RGB(255, 255, 255));
      //std::cout << cursorPos.x << ';' << cursorPos.y << std::endl;
    }
    Sleep(10);
  }
  return 0;
}
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
09.01.2014, 00:12 8
Цитата Сообщение от DU Посмотреть сообщение
поелозте по окну:
C++
1
SetPixel(GetDC(hwnd), cursorPos.x, cursorPos.y, RGB(255, 255, 255));
не долго елозить придется
0
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
09.01.2014, 00:23 9
Bretbas, это та функция, которую я скинул?
У меня она работает на ура.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
09.01.2014, 00:25 10
да нормально там все елозится
это я тут на форуме кому-то демку писал.
в качестве демонстрации работы - пойдет
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
09.01.2014, 00:27 11
Цитата Сообщение от DU Посмотреть сообщение
да нормально там все елозится
пока не упадет. GDI ресурсы же утекают
MSDN: GetDC function
After painting with a common DC, the ReleaseDC function must be called to release the DC.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
09.01.2014, 00:34 12
после 10000 тысяч GDI объектов перестало рисовать. я думал там 16k под это дело дается.
ну с устранением утечек автор думаю справится
0
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
09.01.2014, 23:07  [ТС] 13
Не работает е-мое...скиньте ваш проект пожалуйста...может так зафачит.Код не могу скинуть,так как сижу с мобильного телефона,на компе интернета нет
0
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
10.01.2014, 23:54  [ТС] 14
Короче заработало,но как то странно...дескриптор я получаю стандартной функцией GetConsoleWindow(),ну в прочем это не важно...но вот дескриптор контекста устройства HDC dc я не могу получить функцией BeginPaint(...) почему то,могу получить только с помощью GetDC(...).И еще...при нарисование чего либо,мне приходится рисовать "два раза",иначе на экране ничего нет!Вот и примеру код:
C++
1
2
3
4
5
6
7
8
9
10
#include <windows.h>
#include <conio.h>
void main()
{
HWND hwnd=GetConsoleWindow();
HDC dc=GetDC(hwnd);
TextOut(dc,10,10,L"hi world",8);
TextOut(dc,10,10,L"hi world",8);
getch();
}
Вот короче код,тут функцию TextOut(...) я использую два раза,чтобы нарисовать текст в окне,если я использую ее один раз,то почему то ничего не рисует.
Не подскажите почему так происходит?
0
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
12.01.2014, 01:00  [ТС] 15
Ммм?

Добавлено через 1 минуту
Ну так что?)
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
12.01.2014, 01:07 16
ну хз что там. консольное окно ведь не ожидает что на нем рисовать будут. может
там у него срабатывает евент, который заставляет родную процедуру окна перерисовывать его,
которая и затирает все, что было нелегально нарисовано. можно свернуть развернуть окно и тоже все
затрется, даже если вы сто раз выведите текст. чтобы нарисованное держалось - нужны какие-то
другие методы. либо заменить оконную процедуру, либо в цикле непрерывно перерисовыывать одно и
то же.
0
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
13.01.2014, 03:01  [ТС] 17
Мне кажется это бред...ибо двух итераций цикла достаточно чтобы текст был нарисован в окне...если бы окно постоянно затиралось,тогда бы и при этих двух итерациях я ничего не увидел и пришлось бы как вы сказали делать бесконечный цикл рисования
0
13.01.2014, 03:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.01.2014, 03:01
Помогаю со студенческими работами здесь

Управлять событиями окна консольного приложения
Можно ли как-то ловить события окна консольного приложения ? Конкретно нужно отлавливаться отсылку...

Перемещение окна и получение координат центра окна
Всем доброго времени суток. у меня есть два заданя 1.Написать программу, используя средства...

Запуск программы в фоне (без консольного окна)
Нужно запустить программу написанную на c++ чтоб выполнялась в фоне(без консоли).Как это можно...

Получение данных из окна
Есть Edit Control'ы,из которых я получаю численные значения,а позже текст,но после вызова...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru