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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Получить список окон в mac os  (Прочитано 8496 раз)
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.195 секунд. Запросов: 23.