2012-04-18 8 views
8

Sto provando a far visualizzare un'applicazione con un mirino al centro dello schermo e stare al di sopra di tutto il resto. L'obiettivo è avere un mirino in alcuni giochi FPS che non ne forniscono uno. Ho creato con successo la mia finestra per tutto tranne i giochi:/Come far apparire una finestra in cima a tutto (anche giochi a schermo intero!) C++/Qt

Ecco il mio codice: (tutto è principalmente perché non sto solo testando le funzionalità principali della mia app, l'ho commentato ampiamente per provare e rendere il mio problema più accessibile)

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(); 

La mia ipotesi è che un'applicazione come i giochi abbia un controllo più diretto sul dispositivo di visualizzazione. Sto cercando qualsiasi soluzione a questo problema (non necessariamente uno che coinvolge una finestra in primo piano trasparente). Anche su un sidenote se qualcuno potrebbe spiegarmi come utilizzare in modo efficace GetLastError(), e anche perché il gioco si comporta diversamente da una finestra comune.

Grazie in anticipo.

+0

+1 per una soluzione hi-tech per disegnare un punto sullo schermo in cui si trova il centro delle luci: P – Bojangles

+0

Oh! Conosco quello fuori dal cuore. È 'ACCESS_DENIED' :(C'è qualche API per ottenere il messaggio di errore effettivo dal numero GetLastError(), ma per ora l'ho dimenticato. –

+0

Mi piace che questo usi il tag 'topmost'. :) – unwind

risposta

1

Dalla documentazione SetWindowPos():

Una finestra può essere fatto un più alto finestra sia impostando il parametro hWndInsertAfter a HWND_TOPMOST e garantire che il flag SWP_NOZORDER non è impostato, oppure impostando la posizione di una finestra l'ordine Z in modo che si trovi sopra le finestre più in alto esistenti. Quando una finestra non superiore a viene resa più in alto, anche le sue finestre di proprietà vengono rese in primo piano . I suoi proprietari, tuttavia, non sono cambiati.

Sempre dalla stessa pagina:

Per utilizzare SetWindowPos per portare una finestra nella parte superiore, il processo che possiede la finestra deve avere l'autorizzazione SetForegroundWindow.

Tuttavia, suppongo che il collegamento sia per Windows Vista e versioni successive.

1

ho trovato che la libreria C++ DirectDrawOverlayLib dovrebbe essere in grado di fare questo. Per quotare il sito Web:

Una libreria C++ non gestita per creare, gestire e disegnare in sovrapposizioni DirectDraw. È incluso un wrapper C++/CLI per client .NET A .

Le sovrapposizioni di DirectDraw sono superfici speciali di DirectDraw che vengono mostrate su su tutto il resto, inclusi giochi e applicazioni a schermo intero. Possono essere utilizzati per implementare programmi come XFire che visualizzano informazioni durante l'operazione di gioco a schermo intero.