簡體   English   中英

使用自定義啟動畫面隱藏另一個進程的啟動畫面不適用於 Qt::WindowsStaysOnTopHint

[英]Hiding the splash screen of another process with a custom splash screen does not work with Qt::WindowsStaysOnTopHint

我正在嘗試使用 Qt 啟動一個進程,該進程顯示自己的啟動畫面。 我想把我自己的啟動畫面放在這個進程的啟動畫面上(這個進程與Qt無關,它是一個游戲!)因為我不能修改進程本身。 這應該隱藏進程的啟動畫面並顯示我的。 因此我使用標志 Qt::WindowStaysOnTopHint。 大多數情況下它都有效,但有時我仍然可以在我自己的啟動屏幕上看到進程的啟動屏幕。 有沒有辦法確保我的啟動畫面上沒有其他窗口,除非它是我進程的全屏版本? 我可以以某種方式捕獲進程的窗口句柄並檢查它何時變為全屏還是有更好的標志?

該過程開始顯示啟動畫面,然后變成全屏游戲。 當然,我不想在這個全屏游戲中覆蓋我的啟動畫面,只在開始時覆蓋它的啟動畫面。

#include <QApplication>
#include <QMessageBox>
#include <QProcess>
#include <QSplashScreen>


int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    // This is a modified game which has a splash screen I want to hide. I still show the copyright stuff in the picture ...
    const QString program = "../TPoF.exe";
    QStringList arguments;
    // This is my custom splash screen picture with an different logo thatn the one of the original game but still has the copyright remarks (Everybody knows that this is a modification anyway)
    QPixmap pixmap(":/cropped-dmdf-big.jpg");
    // The flag should make the splash screen overlay the existing one but does not always work.
    QSplashScreen splash(pixmap, Qt::WindowStaysOnTopHint);
    splash.showMessage(QObject::tr("Copyright 2003 Blizzard Entertainment. All rights reserved. (Warcraft III: The Frozen Throne)"), Qt::AlignCenter | Qt::AlignBottom, QColor(0xFFCC00));
    splash.show();
    app.processEvents();

    QProcess *myProcess = new QProcess(&app);
    myProcess->start(program, arguments);

    // Since I don't know how long the original splash screen stays there, I just wait until the whole process has finished. This is not a problem since the game is started in full screen.
    myProcess->waitForFinished();

    splash.close();

    return 0;
    //return app.exec();
}

編輯:顯然有些人沒有得到這個問題,所以我會補充一點:這是對游戲的修改,默認情況下游戲會顯示一個標志。 當用戶開始我的修改時,他會認為他開始的是正常游戲而不是我的修改! 因此,我添加了一個自定義啟動畫面,從一開始就通知他他正在運行修改。 再說原來的logo不符合我的修改。 當然,我仍然可以添加版權文本等,但這不是問題的一部分,因為我知道如何使用 QSplashScreen 執行此操作。 問題是如何在所有其他窗口之上真正顯示啟動畫面/QWidget,因為 Qt::WindowsStaysOnTopHint 並不總是有效。

edit2:原作是魔獸爭霸III:冰封王座。 最初的啟動畫面看起來與此類似,但帶有版權免責聲明,並且右上角沒有暴雪標志: https : //upload.wikimedia.org/wikipedia/en/8/87/Warcraftiii-frozen-throne-boxcover。 jpg

我已經在代碼中添加了文本,因為每個人都看到我在保留它。 如果允許與否,我不確定,但您必須安裝《魔獸爭霸 III:冰封王座》並玩原始游戲。

修改可以在這里找到: http : //www.moddb.com/mods/warcraft-iii-the-power-of-fire

我的閃屏圖片如下所示: 在此處輸入圖片說明

當然彈出來的時候會加上黃色的文字。

由於我沒有隱藏原始游戲或原始版權文本等,因此您很難說這是非法的。 ModDB 上有很多修改,它們改變了游戲的圖形/徽標等,並且只能與原始游戲一起使用。 所以你還是要買游戲....我什至沒有修改游戲。 即使你認為這是允許的,如果你寫一些東西,請討論原始的技術問題。 另一個進程的啟動畫面位於所有其他窗口的頂部是一個技術問題。

這里有兩件事需要考慮 - 您嘗試修改的產品的許可證以及該產品提供的修改其內容的方式。 這些控制着第三方可以與給定產品進行交互(以代碼方式)的方式。

無論您喜歡與否,啟動畫面都是應用程序的一部分 在你的問題中,你已經明確指出

我無法修改流程本身

這意味着您無權訪問其源代碼(即使您獲得了許可證,並且您必須考慮您可以使用該源代碼做什么)並且應用程序本身顯然沒有提供方法供第三方修改其內容(例如,一些游戲開發商允許為他們的游戲添加模組,因此他們也為其提供基礎設施)。

即使出於最好的意圖,您的嘗試也違反了一系列版權法。 此外,您可能還想考慮您正在做的修改,因為從外觀上看,開發人員顯然不希望第三方在原始文件上添加任何內容。 如果我錯了,那么你應該直接聯系背后的人,把事情弄清楚。 即使允許修改,游戲的特定部分(例如啟動畫面)也可能不是這種情況。

最后但並非最不重要的是,我建議您發布有關要修改的應用程序(游戲或其他)的信息,包括其許可證。 這將防止人們認為您想做非法的事情(當我告訴您閱讀您的帖子指向那個方向時,請相信我)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM