Как сделать так, чтобы окно отображалось поверх всего (даже в полноэкранных играх!) C++/Qt

Я пытаюсь сделать так, чтобы приложение отображало перекрестие в центре экрана и оставалось поверх всего остального. Цель состоит в том, чтобы в некоторых играх FPS не было перекрестия. Я успешно сделал мое окно верхним для всего, кроме игр:/

Вот мой код: (все в основном, так как я только тестирую основные функции своего приложения, я прокомментировал его, чтобы попытаться сделать мою проблему более доступной)

QApplication app(argc, argv);

DWORD error;
QWidget window;
QLabel *label = new QLabel(&window);
label->setText("<strong>O<strong>");//I'm using an "O" as a crosshair until I can figure out how to display image transparency.
window.setGeometry(960-label->width()/2,540-label->height()/2,label->width(),label->height());//here I'm making my window appear in the center of my screen
window.setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);// here making the window frameless and topMost via qt
window.setAttribute(Qt::WA_TranslucentBackground);//making the window see through
window.setWindowTitle("Crosshair");
window.show();

//in this next part I tried using windows api to make my window appear on top of the game.
HWND handle, myHandle;
myHandle = FindWindow(NULL,TEXT("Crosshair"));//retieving my own application window handle
if(myHandle == 0){cout << "no own handle" << endl;}//it successfully retrieves it

handle = FindWindow(NULL,TEXT("Killing Floor"));//retrieving a game window handle
if(handle == 0){cout << "no KF handle" << endl;}//it successfully retrieves it

if(handle != 0 && myHandle != 0)
{
    if(SetWindowPos(handle,myHandle,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE) == 0){cout << "couldnt set notopmost" << endl;}//here SetWindowPos returns 0 (function failed)
}
          // I've also tried using SetWindowPos to set the game to Not TOPMOST, it didnt work either.
          // here was my code : SetWindowPos(handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);

error = GetLastError();// i tried using GetLastError to understand what was happening
cout << error << endl;// but it only returns "5", I've read that you can look in WINNT.H for information about the meanings of error codes
                      // however its a pretty big file and I wasn't able to understand where the relevant part was.


return app.exec();

Я предполагаю, что такие приложения, как игры, имеют более прямой контроль над устройством отображения. Я ищу любое решение этой проблемы (не обязательно с участием прозрачного верхнего окна). Также, если кто-то может объяснить мне, как эффективно использовать GetLastError(), а также почему игра ведет себя не так, как обычное окно.

Заранее спасибо.

3 ответа

Я знаю, что это не очень помогает вам, но, пожалуйста, взгляните на это сообщение от Рэймонда Чена: Как мне создать самое верхнее окно, которое никогда не будет закрыто другими самыми верхними окнами?

Я обнаружил, что библиотека C++ http://www.codeplex.com/DirectDrawOverlayLib должна быть в состоянии сделать это. Цитировать сайт:

Неуправляемая библиотека C++ для создания, управления и рисования с использованием оверлеев DirectDraw. Оболочка C++/CLI для клиентов.NET включена.

Наложения DirectDraw - это специальные поверхности DirectDraw, которые отображаются поверх всего остального, включая полноэкранные игры и приложения. Их можно использовать для реализации таких программ, как XFire, которые отображают информацию во время полноэкранного режима игры.

Из документации SetWindowPos():

Окно можно сделать самым верхним окном, либо установив для параметра hWndInsertAfter значение HWND_TOPMOST и убедившись, что флаг SWP_NOZORDER не установлен, либо установив положение окна в порядке Z, чтобы оно находилось выше любых существующих верхних окон. Когда не верхнее окно становится верхним, его собственные окна также становятся верхними. Однако его владельцы не изменились.

Также с той же страницы:

Чтобы использовать SetWindowPos для переноса окна наверх, процесс, которому принадлежит окно, должен иметь разрешение SetForegroundWindow.

Тем не менее, я думаю, что ссылка для Windows Vista и выше.

Другие вопросы по тегам