Используйте функцию из user32.dll в приложении Qt4

я не могу использовать функцию MonitorFromPoint в своем приложении Qt. У меня последняя версия Qt SDL 2010.05 с mingw для Windows XP.

#include <QtCore/QCoreApplication>
#include<windows.h>
#include <winuser.h>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    POINT pt;
    MonitorFromPoint(pt,2);
    return a.exec();
}

Я добавил это в файл .pro

LIBS+= -luser32

И результат

g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"..\include\QtCore" -I"..\include" -I"..\include\ActiveQt" -I"tmp\moc\debug_shared" -I"..\testUser32" -I"." -I"..\mkspecs\win32-g++" -o tmp\obj\debug_shared\main.o ..\testUser32\main.cpp

mingw32-make[1]: Leaving directory `C:/Qt/2010.05/qt/testUser32-build-desktop'

mingw32-make: Leaving directory `C:/Qt/2010.05/qt/testUser32-build-desktop'

..\testUser32\main.cpp: In function 'int main(int, char**)':

..\testUser32\main.cpp:8: error: 'MonitorFromPoint' was not declared in this scope

mingw32-make[1]: *** [tmp/obj/debug_shared/main.o] Error 1

mingw32-make: *** [debug-all] Error 2

The process "C:/Qt/2010.05/mingw/bin/mingw32-make.exe" exited with code %2.
Error while building project testUser32 (target: Desktop)
When executing build step 'Make'

Кто-то в IRc сказал, что это проблема mingw, и я должен использовать компилятор visualc. Переключение компилятора потребует времени и, возможно, я найду другие проблемы. Я импортировал функции из wingdi.h, и у меня не было проблем. Мне нужно лучшее объяснение проблемы, как вы ее понимаете и решение

P.S. Я пытаюсь получить геометрию экрана в системе с несколькими мониторами, QDesktopWidget не работает, см. тему Захват изображения рабочего стола с нескольких экранов с помощью Qt4


person simion314    schedule 22.10.2010    source источник
comment
Я не уверен, насколько смешным будет мой комментарий. Однако вы можете вручную включить подпись функции. LOL, хотя это не постоянное средство. Но это должно работать.   -  person Neel Basu    schedule 22.10.2010


Ответы (1)


Я нашел это http://www.mingw.org/wiki/Use_more_recent_defined_functions

Я снова посмотрел на заголовок, где функция определена, и я увидел это

#if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410)
WINUSERAPI HMONITOR WINAPI MonitorFromPoint(POINT,DWORD);

это означает, что эти методы не будут работать в старых версиях Windows. Решение состоит в том, чтобы определить

#include <QtCore/QCoreApplication>
#define _WIN32_WINNT  0x0500
#include<windows.h>
#include <winuser.h>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    POINT pt;
    MonitorFromPoint(pt,2);
    return a.exec();
}
person simion314    schedule 22.10.2010
comment
Лучше определить эту переменную среды в файле вашего проекта. Он не должен отличаться в исходных файлах; в конечном итоге вы скомпилируете половину исходных кодов для Windows 2000, а другую половину — для Windows XP. Это особенно болезненно, поскольку в некоторые типы добавляются новые члены, поэтому их sizeof изменяется. (Вот почему такие структуры имеют поле cb — Windows проверяет его, чтобы увидеть, какие элементы вы использовали) - person MSalters; 22.10.2010