Russian Qt Forum
Июля 06, 2025, 02:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Получить список окон в mac os  (Прочитано 8835 раз)
virtual_root
Гость
« : Июля 20, 2012, 15:41 »

И снова всем привет. Нашла в документации функции для работы с окнами в mac os https://developer.apple.com/library/mac/#documentation/Carbon/Reference/CGWindow_Reference/Reference/Functions.html  но вот беда не могу подключить фреймворк HIToolbox, который для этого нужен. ApplicationServices/HIServices.h подключила, но функции CGWindowListCopyWindowInfo и CGWindowListCreate по прежнему не доступны. помогите пожалуйста!
Код
C++ (Qt)
LIBS += -framework CoreFoundation -framework Carbon -framework Carbon/Frameworks/HIToolbox
 
LIBS += -framework ApplicationServices
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Июля 20, 2012, 16:40 »

фреймворки HIToolbox и Carbon тут не нужны, а инклудить в коде надо CGWindow.h
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
virtual_root
Гость
« Ответ #2 : Июля 23, 2012, 09:52 »

Код
C++ (Qt)
Include <CGWindow.h>
он его не видит... помоему точно нужно подключить HIToolbox
Записан
virtual_root
Гость
« Ответ #3 : Июля 25, 2012, 10:15 »

Подключила файл CGWindow.h но функция CGWindowListCreate всё равно не доступна... Ребят подскажите, пожалуйста, что ещё нужно подключить. Вот ссылка на документацию https://developer.apple.com/library/mac/#documentation/Carbon/Reference/CGWindow_Reference/Reference/Functions.html
Вот как подключаю файл:
Код
C++ (Qt)
#include </System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreGraphics.framework/Headers/CGWindow.h>
Мне нужны функции из приведенной документации использовать.
« Последнее редактирование: Июля 25, 2012, 10:25 от tiny developer » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Июля 25, 2012, 11:09 »

так подключать файл неправильно – надо или только по названию или <фреймворк/файл>. попробуй ещё добавить
Код:
LIBS += -framework CoreGraphics
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
virtual_root
Гость
« Ответ #5 : Июля 25, 2012, 11:32 »

 всё заработало!
Теперь пытаюсь воспользоваться двумя функциями: CGWindowListCreate - возвращает массив идентификаторов окон активной сессии и функция CGWindowListCreateDescriptionFromArray - возвращает информацию об окнах. Но что-то не компилируется код.. я что-то наверное не правильно указываю... подскажите пожалуйста.
Вот код:
Код
C++ (Qt)
   CGWindowListOption option;
   CGWindowID relativeToWindow;
   CGWindowListCreate(option,relativeToWindow);
   CFDictionaryRef array = CGWindowListCreateDescriptionFromArray(relativeToWindow);  // здесь не проходит
Записан
virtual_root
Гость
« Ответ #6 : Июля 25, 2012, 11:42 »

Вылазиют такие ошибки:
Код
C++ (Qt)
ошибка: invalid conversion from 'CGWindowID' to 'const __CFArray*'
ошибка: cannot convert 'const __CFArray*' to 'const __CFDictionary*' in initialization
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Июля 25, 2012, 12:10 »

читать умеем? функция возвращает массив, а ты пытаешься записать результат в словарь
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
virtual_root
Гость
« Ответ #8 : Июля 25, 2012, 12:54 »

немного разобралась, помогли добрые люди). Написала такую функцию:
Код
C++ (Qt)
void MacAPIWindows::GetListWindow(){
 
   CGWindowListOption option;
   CGWindowID relativeToWindow;
 
   CFArrayRef array = CGWindowListCreate(option,relativeToWindow);
 
   /// ???????? ?? ??????? CFArrayRef
   CFIndex cfiLen = CFArrayGetCount(array);
   int WID;
   for (CFIndex cfiI = 0; cfiI < cfiLen; cfiI++){
       CFArrayGetValueAtIndex(array, cfiI);
       WID = (int)cfiI;
       qDebug()<<WID;
   }
   /// ??????? ?????????? ?? ?????? ????
 
   CFAllocatorRef alloc;
   CFArrayRef arrayInform = CFArrayCreateCopy(alloc, CGWindowListCreateDescriptionFromArray(array));
 
   /// ???????? ?? ??????? CFArrayRef
   CFIndex cfiLen = CFArrayGetCount(arrayInform);
   CFDictionaryRef dictionary;
   for (CFIndex cfiI = 0; cfiI < cfiLen; cfiI++){
       CFArrayGetValueAtIndex(arrayInform, cfiI);
       dictionary = (CFDictionaryRef)cfiI;
       // а как со словарем работать ?
   }
 
}
Только вот никак не могу понять как извлечь значения по ключу из словаря  Непонимающий
Может кто подскажет?
« Последнее редактирование: Июля 25, 2012, 13:38 от tiny developer » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Июля 25, 2012, 13:02 »

открываешь документацию по CFDictionary и ищешь функцию типа CFDictionaryGetValueForKey.

вообще, если есть возможность, то лучше пиши участки маковского кода на Objective-C – получится намного короче и понятнее.

и ещё: функции, у которых в имени есть Create, предполагают, что пользователь сам должен освобождать память, выделенную на возвращённый объект, так что в конце подописывай CFRelease(array) и т.д.

и ты неправильно с массивом работаешь:
Код
C++ (Qt)
   CFIndex cfiLen = CFArrayGetCount(array);
   int WID;
   for (CFIndex cfiI = 0; cfiI < cfiLen; cfiI++){
       WID = CFArrayGetValueAtIndex(array, cfiI); // хотя тут даже скорее хранятся CFNumber или что-то такое, а не простые инты
       qDebug()<<WID;
   }
« Последнее редактирование: Июля 25, 2012, 13:08 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
virtual_root
Гость
« Ответ #10 : Июля 25, 2012, 13:15 »

А разве можно в Qt Objective-C использовать? Покажите как, я с удовольствием перейду на это)
В документации нашла метод CFDictionaryGetValue, написала так:
Код
C++ (Qt)
/// ???????? ?? ??????? CFArrayRef
   cfiLen = CFArrayGetCount(arrayInform);
   CFDictionaryRef dictionary;
   for (CFIndex cfiI = 0; cfiI < cfiLen; cfiI++){
       CFArrayGetValueAtIndex(arrayInform, cfiI);
       dictionary = (CFDictionaryRef)cfiI;
       CFDictionaryGetValue(dictionary,kCGWindowOwnerName);
       //qDebug()<<WID;
   }
Но теперь не могу понять где мне получить моё значение ? Ведь функция  CFDictionaryGetValue возвращает void...
Записан
mutineer
Гость
« Ответ #11 : Июля 25, 2012, 13:19 »

Но теперь не могу понять где мне получить моё значение ? Ведь функция  CFDictionaryGetValue возвращает void...

http://stackoverflow.com/questions/6007575/cfdictionarygetvalue
Цитировать
The result of CFDictionaryGetValue is what you put in the dictionary.

You have to cast the result of CFDictionaryGetValue to the right pointer type to access the structure members
Записан
virtual_root
Гость
« Ответ #12 : Июля 25, 2012, 13:35 »

Цитировать
вообще, если есть возможность, то лучше пиши участки маковского кода на Objective-C – получится намного короче и понятнее.
Покажите как это делать?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #13 : Июля 25, 2012, 13:54 »

Цитировать
вообще, если есть возможность, то лучше пиши участки маковского кода на Objective-C – получится намного короче и понятнее.
Покажите как это делать?
вот пример: http://www.prog.org.ru/topic_22129_0.html
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
virtual_root
Гость
« Ответ #14 : Июля 25, 2012, 15:18 »

Интересно) а как вы в qt сделали файл с расширением .mm и как это скомпилировали ? Расскажите пожалуйста)
У меня всё получилось с CFDictionaryRef ! Вот как я сделала:
Код
C++ (Qt)
   CFDictionaryRef dictionary;
   for (CFIndex cfiI = 0; cfiI < cfiLen; cfiI++){
      dictionary = (CFDictionaryRef) CFArrayGetValueAtIndex(arrayInform, cfiI);
       CFStringRef name = (CFStringRef)CFDictionaryGetValue(dictionary,kCGWindowOwnerName);
       qDebug()<<uniCFStrToQStr(name); // моя фун-я
   }
 
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.072 секунд. Запросов: 20.