2012-08-01 106 views
2

我最近開始學習Python,並編寫了一個腳本,通知我某個網站何時更改內容。然後我將它作爲計劃任務添加到Windows,以便每10分鐘運行一次。我希望能夠立即通知網站更改,所以我添加了一個win32ui MessageBox,如果腳本檢測到網站已更改,它會彈出。下面是一些代碼片段我使用了的MessageBox(富有想象力的文字,我知道):將Win32 MessageBox顯示在其他程序

win32ui.MessageBox("The website has changed.", "Website Change", 0) 

我的問題是這樣的,我使用遠程桌面,所以當在MessageBox並彈出它坐在花了我大部分時間在遠程桌面會話後面,有什麼辦法強制MessageBox出現在它的頂部?

當腳本運行命令行時,類似的說明會在遠程桌面會話中打開一個我不想要的東西,是否有任何方法可以阻止此行爲?

我很高興與Windows特定的解決方案,因爲我知道這可能意味着處理窗口管理器或可能的另一種方式來通知我,而不是使用MessageBox。

回答

6

當您從任務計劃程序啓動任何內容時,Windows會阻止任何「簡單」方法將您的窗口或對話框置頂。

  1. 第一種方法 - 使用MB_SYSTEMMODAL(4096值)標誌。根據我的經驗,它使Msg對話框「總是在最前面」。

    win32ui.MessageBox("The website has changed.", "Website Change", MB_SYSTEMMODAL) 
    
  2. 二的方式 - 儘量把您的控制檯/窗/對話框前與下面的調用。當然,如果您使用MessageBox,則必須在致電MessageBox之前執行此操作(針對您自己創建的窗口)。

    SetForegroundWindow(Wnd); 
    BringWindowToTop(Wnd); 
    SetForegroundWindow(Wnd); 
    

至於控制檯窗口的閃爍,您可以嘗試在隱藏狀態下啓動了Python。例如,使用ConEmu,'HidCon'或cmdow。請參閱它們的參數,是這樣的:

ConEmu -basic -MinTSA -cmd C:\Python27\python.exe C:\pythonScript.py 
    or 
CMDOW /RUN /MIN C:\Python27\python.exe C:\pythonScript.py 
+0

如果這項工作,它將非常感謝,我不能嘗試它,直到明天,但會回到你那裏。有關阻止RDP會話彈出的命令窗口的任何想法,還是我必須忍受它?這只是一個輕微的煩惱,每10分鐘就會彈出一次,而不是一個大問題。 – Peanut 2012-08-01 18:42:46

+0

在任務計劃程序中,我調用類似「C:\ Python27 \ python.exe C:\ pythonScript.py」的程序,該程序運行該腳本並在關閉之前使命令行在短時間內彈出。 – Peanut 2012-08-01 18:53:03

+0

答覆已更新。 – Maximus 2012-08-01 19:11:33

0

使消息框系統模式將導致它彈出每個應用程序,但沒有人可以交互,直到它被解僱。考慮創建一個自定義對話框窗口,您可以將它帶到前面或使用通知氣泡。

+0

「但沒有一個能與互動,直到它被駁回」是不正確的,實際上。 MB_SYSTEMMODAL表示MessageBox將「始終在最前面」。就這樣。 – Maximus 2012-08-01 18:37:03

+0

讓它到微軟得到「模態」錯誤... – 2012-08-01 18:37:58

+0

有沒有辦法打開一個消息框強制與它的交互?我只是想,如果我在遠程桌面上工作,我會點擊很多,如果它出現在我的另一臺顯示器上,並且很快就會最小化,可能會錯過彈出窗口。 – Peanut 2012-08-01 18:46:46

0

Windows會嘗試使它很難在活躍的應用程序彈出一個窗口。用戶覺得煩人,特別是因爲中斷窗口通常會竊取鍵盤焦點。

Windows提供此類通知的方式是在通知區域使用氣球而不是消息框。通知氣球不會竊取焦點,並且(據說)不太注意力分散。

我不確定python Windows UI庫是否提供notification balloons的包裝。

+0

即使Python確實爲通知提供了封裝器,我也不認爲這會起作用,那麼通知會出現在遠程桌面會話後面嗎?雖然Outlook設法讓通知以某種方式出現在RDP會話的左上角。 – Peanut 2012-08-01 20:51:35

1

使用ctypes的它會顯示一個Windows錯誤消息框,非常容易使用,

import ctypes 
if condition: 
    ctypes.windll.user32.MessageBoxW(0, u"Error", u"Error", 0) 
+0

我會看看這個謝謝。 – Peanut 2012-08-01 21:36:40

+1

在我的情況下,它仍然顯示在另一個窗口下面... – ellockie 2016-10-07 14:31:45