9

画面の中央に十字線を表示し、他のすべての上にとどまるアプリケーションを作成しようとしています。その目的は、十字線を提供しない一部の 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() を効果的に使用する方法と、ゲームの動作が一般的なウィンドウとは異なる理由を説明できる場合は、補足として。

前もって感謝します。

4

3 に答える 3

2

これが実際には役に立たないことはわかっていますが、レイモンド・チェンからのこの投稿をご覧ください。他の最上位のウィンドウで覆われることのない最上位のウィンドウを作成するにはどうすればよいですか。

于 2012-04-18T14:13:11.457 に答える
1

C++ ライブラリDirectDrawOverlayLibがこれを実行できるはずであることがわかりました。ウェブサイトを引用するには:

DirectDraw オーバーレイを作成、管理、および描画するためのアンマネージ C++ ライブラリ。.NET クライアント用の C++/CLI ラッパーが含まれています。

DirectDraw オーバーレイは、フルスクリーンのゲームやアプリケーションなど、他のすべての上に表示される特別な DirectDraw サーフェスです。フルスクリーンのゲーム操作中に情報を表示する XFire などのプログラムを実装するために使用できます。

于 2012-09-07T09:21:02.843 に答える
1

SetWindowPos()ドキュメントから:

hWndInsertAfter パラメーターを HWND_TOPMOST に設定し、SWP_NOZORDER フラグが設定されていないことを確認するか、Z オーダーでウィンドウの位置を設定して、既存の最上位ウィンドウよりも上になるようにすることで、ウィンドウを最上位ウィンドウにすることができます。最上位以外のウィンドウが最上位になると、そのウィンドウが所有するウィンドウも最上位になります。ただし、その所有者は変更されません。

また、同じページから:

SetWindowPos を使用してウィンドウを最前面に移動するには、ウィンドウを所有するプロセスに SetForegroundWindow 権限が必要です。

ただし、リンクは Windows Vista 以降のものだと思います。

于 2012-04-18T13:56:26.210 に答える