Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
33 / 32 / 2
Регистрация: 26.01.2009
Сообщений: 592

Определение окна

20.10.2010, 21:51. Показов 4617. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как определить окно на другом рабочем столе. Т.е. моя прога загружается на столе "default" - создает стол, запускает браузер на созданном рабочем столе. как теперь мне хэндл этого окна браузера определить?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.10.2010, 21:51
Ответы с готовыми решениями:

Определение хэндла окна
Как определить Хэндл окна на другом рабочем окне. Создаешь рабочий стол, запускаешь там приложение - вот как определить хэндл окна этого...

Определение координат дочернего окна
Здравствуйте! Создал массив из 16 дочерних окно. Как узнать их координаты относительно родительского окна?Я так думаю... case...

OpenGL: определение треугольной текстуры с области окна
Здравствуйте, в OpenGL совсем зелёный, и очень рассчитываю на вашу помощь... Как определить текстуру треугольной формы из части...

7
 Аватар для radiohobbyt
192 / 190 / 15
Регистрация: 27.01.2009
Сообщений: 548
21.10.2010, 13:43
у винды один рабочий стол. FindWindow()
0
33 / 32 / 2
Регистрация: 26.01.2009
Сообщений: 592
21.10.2010, 14:04  [ТС]
Не соглашусь CreateDesktop - создает рабочий стол дополнительный, и запускает программы на этом рабочем столе нормально - т.е. в процессах программа видна, а на рабочем столе основного рабочего стола окно отсутствует. Где тогда висит процесс?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
21.10.2010, 16:50
Алгоритм такой:
1) Создаете оконную станцию (CreateWindowStation);
2) Присваиваете текущему процессу новую станцию (SetProcessWindowStation);
3) Создаете рабочий стол (CreateDesktop);
4) Работаете с нужными Вам окнами.
5) Закрываете оконную станцию и рабочий стол (если надо конечно) - CloseDesktop и CloseWindowStation.

В теории (и по документации из MSDN) должно всё работать.
0
33 / 32 / 2
Регистрация: 26.01.2009
Сообщений: 592
27.10.2010, 21:55  [ТС]
не получается - может не так че делаю

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
sList1 = new TStringList();
bool bYes=false;
BOOL bOk=EnumWindowStations((WNDENUMPROC)EWSProc, (LPARAM)0);
for(int i=0;i<sList1->Count;i++)
    if (sList1->Strings[i]==cWin)
      {
      bYes=true;
      break;
      }
if (!bYes) hWinSta = CreateWindowStation(cWin.c_str(), 0, GENERIC_ALL, NULL);
 else
   hWinSta=OpenWindowStation(cWin.c_str(), FALSE, MAXIMUM_ALLOWED);
 
SetProcessWindowStation(hWinSta);
sList->Clear();
bOk=EnumDesktops(GetProcessWindowStation(),(DESKTOPENUMPROC)EnumDesktopProc,
       (LPARAM)0);
bYes=false;
for(int i=0;i<sList1->Count;i++)
    if (sList1->Strings[i]==cDesk)
      {
      bYes=true;
      break;
      }
OldDesktopHandle = GetThreadDesktop(GetCurrentThreadId());
if (!bYes)
  {
  DesktopHandle = CreateDesktop(cDesk.c_str(),NULL,NULL,0,GENERIC_ALL,NULL);
  }
  else
   DesktopHandle = OpenDesktop(cDesk.c_str(), 0, FALSE, MAXIMUM_ALLOWED);
SetThreadDesktop(DesktopHandle);
SwitchDesktop(DesktopHandle);
//::Sleep(2000);
//SwitchDesktop(OldDesktopHandle);
delete sList1;
потом работаю с окном как FindWindow
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.10.2010, 03:19
C++
1
2
3
4
5
6
7
/* 100% рабочий алгоритм (проверено):
* 1) Создать рабочий стол: CreateDesktop;
* 2) Установить текущему потоку новый рабочий стол: SetThreadDesktop;
* 3) Переключиться на новый рабочий стол: SwitchDesktop;
* 4) Запустить процесс
* 5) Выполнить перечисление всех окон: EnumWindows;
* 6) Закрыть Desktop при неоходимости.*/
Кодом могу помочь только на C#.
0
33 / 32 / 2
Регистрация: 26.01.2009
Сообщений: 592
28.10.2010, 08:46  [ТС]
ну так и делаю в коде, если создание станции убрать не находит

Добавлено через 2 минуты
Запустить рабочий процесс я имею ввиду на созданном рабочем столе - если запускаю на этом то же то вопросов нет находит
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.10.2010, 12:04
Вот пример на C# (код почти идентичен C++, т.к. используется API):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
        static void Main(string[] args)
        {
            int err;
 
            // IntPtr = HANDLE, HDESK
            IntPtr hDesktop = // Создаем рабочий стол
                CreateDesktop("NewDesktop", default(string), IntPtr.Zero, 0x0001, GENERIC_ALL /* 0x1FF */, IntPtr.Zero);
 
            if (!SUCCESS(hDesktop))
                throw new Win32Exception(_geterr()); // Выброс эксепшена
 
            if (!SetThreadDesktop(hDesktop) && (err = _geterr()) != 0)  // Аттачим главный поток приложения 
                throw new Win32Exception(err);                          // к новому desktop'у
            //if (GetThreadDesktop(AppDomain.GetCurrentThreadId()) != hDesktop)
            //    throw new Win32Exception(_geterr());
 
            IntPtr hOldDesktop = OpenInputDesktop(0x0001, false, GENERIC_ALL); // Получаем активный desktop
 
            if (!SwitchDesktop(hDesktop) && (err = _geterr()) != 0) // Переключаемся на новый
                throw new Win32Exception(err);
 
            // Запускаем процесс
            _shell(Environment.GetEnvironmentVariable("windir") + "\\notepad.exe", "NewDesktop");
            Thread.Sleep(5000); // Аналог Sleep
 
            string temp;
            EnumWindows((hWnd, lParam) => // Перечисление окон
            {
                if (!string.IsNullOrEmpty(temp = _getwincap(hWnd)))
                    Console.WriteLine(temp); // Вывод в консоль
                return true;
            }, IntPtr.Zero);
 
            Thread.Sleep(1000);
            if (!SwitchDesktop(hOldDesktop) && (err = _geterr()) != 0) // Переключаемся на изначальный desktop
                throw new Win32Exception(err);
 
            if (!SetThreadDesktop(hOldDesktop) && (err = _geterr()) != 0)   // Аттачим главный поток приложения 
                throw new Win32Exception(err);                              // к старому desktop'у
 
            CloseDesktop(hDesktop); // Закрываем новый
            if ((err = _geterr()) != 0)
                throw new Win32Exception(err);
 
            Console.Read(); // Чтение из консоли
        }
 
        // Выступает в роли макроса, проверка на валидность указателя.
        static bool SUCCESS(IntPtr hObject)
        {
            return hObject != IntPtr.Zero;
        }
 
        // Надстройка над GetLastError
        static int _geterr()
        {
            return Marshal.GetLastWin32Error();
        }
 
        // Надстройка над CreateProcess
        static void _shell(string file, string desktop)
        {
            STARTUPINFO si = new STARTUPINFO();
            si.cb = Marshal.SizeOf(si);
            si.lpDesktop = desktop;
            PROCESS_INFORMATION pi;
            int err;
            if (!CreateProcess(file, default(string), IntPtr.Zero, IntPtr.Zero, false, 0x20U, IntPtr.Zero,
                default(string), ref si, out pi) && (err = _geterr()) != 0)
                throw new Win32Exception(err);
        }
 
        // Надстройка над GetWindowCaption
        static string _getwincap(IntPtr hWnd)
        {
            StringBuilder sb = new StringBuilder(255);
            int ret = GetWindowText(hWnd, sb, sb.Capacity);
            return sb.ToString(0, ret);
        }
Вот EXE, требуется .NET 2.0:
Вложения
Тип файла: rar [EXE] DesktopCreate.rar (3.6 Кб, 112 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.10.2010, 12:04
Помогаю со студенческими работами здесь

Получить цвет пикселя из неактивного окна, перекрытого другими окнами окна
Можно ли получить цвет пикселя из неактивного или перекрытого другими окна? Какие есть способы? Погуглил, вроде говорят что можно сделать...

Как получить координаты окна в относительно его родительского окна?
А то походу GetWindowRect(Window, &amp;WindowRectangle); относительно экрана получает. А надо относительно клиентской области родительского...

Как получить размеры клиентской области окна-родителя в функции дочернего окна?
задание такое: имеется дочернее окно,которое &quot;убегает&quot; от курсора мыши в пределах родительского окна. я создала главное окно,и дочернее,...

Окно: создать 4 окна, в центре каждого из окон вывести номер окна в порядке создания(1-4)
Не могу справиться с программой, Нужно создать 4 окна. В центре каждого из окон вывести номер окна в порядке создания(1-4). При нажатии...

Создание невидимого окна поверх окна другой программы
Здравствуйте, как сделать невидимое окно поверх окна сторонней программы , например блокнота, и если изменился размер блокнота то и окно...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru