Russian Qt Forum

Qt => Вопросы новичков => Тема начата: virtual_root от Июль 20, 2012, 15:41



Название: Получить список окон в mac os
Отправлено: virtual_root от Июль 20, 2012, 15:41
И снова всем привет. Нашла в документации функции для работы с окнами в mac os https://developer.apple.com/library/mac/#documentation/Carbon/Reference/CGWindow_Reference/Reference/Functions.html (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


Название: Re: Получить список окон в mac os
Отправлено: kambala от Июль 20, 2012, 16:40
фреймворки HIToolbox и Carbon тут не нужны, а инклудить в коде надо CGWindow.h


Название: Re: Получить список окон в mac os
Отправлено: virtual_root от Июль 23, 2012, 09:52
Код
C++ (Qt)
Include <CGWindow.h>
он его не видит... помоему точно нужно подключить HIToolbox


Название: Re: Получить список окон в mac os
Отправлено: virtual_root от Июль 25, 2012, 10:15
Подключила файл CGWindow.h но функция CGWindowListCreate всё равно не доступна... Ребят подскажите, пожалуйста, что ещё нужно подключить. Вот ссылка на документацию https://developer.apple.com/library/mac/#documentation/Carbon/Reference/CGWindow_Reference/Reference/Functions.html (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>
Мне нужны функции из приведенной документации использовать.


Название: Re: Получить список окон в mac os
Отправлено: kambala от Июль 25, 2012, 11:09
так подключать файл неправильно – надо или только по названию или <фреймворк/файл>. попробуй ещё добавить
Код:
LIBS += -framework CoreGraphics


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


Название: Re: Получить список окон в mac os
Отправлено: virtual_root от Июль 25, 2012, 11:42
Вылазиют такие ошибки:
Код
C++ (Qt)
ошибка: invalid conversion from 'CGWindowID' to 'const __CFArray*'
ошибка: cannot convert 'const __CFArray*' to 'const __CFDictionary*' in initialization


Название: Re: Получить список окон в mac os
Отправлено: kambala от Июль 25, 2012, 12:10
читать умеем? функция возвращает массив, а ты пытаешься записать результат в словарь


Название: Re: Получить список окон в mac os
Отправлено: virtual_root от Июль 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;
       // а как со словарем работать ?
   }
 
}
Только вот никак не могу понять как извлечь значения по ключу из словаря  ???
Может кто подскажет?


Название: Re: Получить список окон в mac os
Отправлено: kambala от Июль 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;
   }


Название: Re: Получить список окон в mac os
Отправлено: virtual_root от Июль 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...


Название: Re: Получить список окон в mac os
Отправлено: mutineer от Июль 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


Название: Re: Получить список окон в mac os
Отправлено: virtual_root от Июль 25, 2012, 13:35
Цитировать
вообще, если есть возможность, то лучше пиши участки маковского кода на Objective-C – получится намного короче и понятнее.
Покажите как это делать?


Название: Re: Получить список окон в mac os
Отправлено: kambala от Июль 25, 2012, 13:54
Цитировать
вообще, если есть возможность, то лучше пиши участки маковского кода на Objective-C – получится намного короче и понятнее.
Покажите как это делать?
вот пример: http://www.prog.org.ru/topic_22129_0.html


Название: Re: Получить список окон в mac os
Отправлено: virtual_root от Июль 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); // моя фун-я
   }
 


Название: Re: Получить список окон в mac os
Отправлено: virtual_root от Июль 25, 2012, 15:25
только вот что-то по другому ключу не могу получить ничего..
Код
C++ (Qt)
CFStringRef title = (CFStringRef)CFDictionaryGetValue(dictionary,kCGWindowName);
Не подскажите почему? Может чтобы получать это значение нужно было заранее что-то описать?


Название: Re: Получить список окон в mac os
Отправлено: kambala от Июль 25, 2012, 15:27
Интересно) а как вы в qt сделали файл с расширением .mm и как это скомпилировали ? Расскажите пожалуйста)
расширение можно прописать файлу любое. .mm – это исходник Objective-C++ (разрешает смешивать код Objective-C и C++). эти исходники подключаются в раздел OBJECTIVE_SOURCES, а заголовочные файлы Objective-C (в смысле где присутствуют какие-то специфические Objective-C-объявления типа @class, @interface, и т.п.) – соответствтенно в OBJECTIVE_HEADERS.
только вот что-то по другому ключу не могу получить ничего..
Код
C++ (Qt)
CFStringRef title = (CFStringRef)CFDictionaryGetValue(dictionary,kCGWindowName);
Не подскажите почему? Может чтобы получать это значение нужно было заранее что-то описать?
посмотри что там вообще в словаре есть с помощью CFShow(dictionary) (будет вывод в консоль)


Название: Re: Получить список окон в mac os
Отправлено: virtual_root от Июль 25, 2012, 15:32
уже разобралась, оказывается у не которых окон нет заголовков, они скрытые и возвращается значение 0, а я пытаюсь его в QString преобразовать :D
Переделала так:
Код
C++ (Qt)
  CFIndex cfiLen = CFArrayGetCount(arrayInform);
   CFDictionaryRef dictionary;
   for (CFIndex cfiI = 0; cfiI < cfiLen; cfiI++){
      dictionary = (CFDictionaryRef) CFArrayGetValueAtIndex(arrayInform, cfiI);
       CFStringRef name = (CFStringRef)CFDictionaryGetValue(dictionary,kCGWindowOwnerName);
       CFStringRef title = (CFStringRef)CFDictionaryGetValue(dictionary,kCGWindowName);
       qDebug()<<uniCFStrToQStr(name);
       if (title != 0) qDebug()<<uniCFStrToQStr(title)<<"!";
   }
 


Название: Re: Получить список окон в mac os
Отправлено: virtual_root от Июль 25, 2012, 15:35
Цитировать
расширение можно прописать файлу любое. .mm – это исходник Objective-C++ (разрешает смешивать код Objective-C и C++). эти исходники подключаются в раздел OBJECTIVE_SOURCES, а заголовочные файлы Objective-C (в смысле где присутствуют какие-то специфические Objective-C-объявления типа @class, @interface, и т.п.) – соответствтенно в OBJECTIVE_HEADERS.
Это в .pro файле прописывать надо?
OBJECTIVE_SOURCES и OBJECTIVE_HEADERS
А можно примерчик ? Вы наверное где-то файл .mm добавляете в .pro файле?


Название: Re: Получить список окон в mac os
Отправлено: kambala от Июль 25, 2012, 15:51
да, в .pro. я же написал что в какой раздел добавлять (файлы .m (чистый Objective-C, без плюсов) кстати тоже в OBJECTIVE_SOURCES).


Название: Re: Получить список окон в mac os
Отправлено: virtual_root от Июль 25, 2012, 18:13
спасибо буду пробовать)