2017-05-19 7 views
0

사용자에게 알림을 제공하지만 창 전체 화면 모드 (경계선 없음)에서는 표시되지 않는 작은 앱을 작성하고 있습니다. 전체 화면으로 작동하지 않을 것으로 예상되지만 국경을 넘어서야한다고 생각했습니다.Python - 경계없는 창에서 Windows 토스트 알림 표시

나는 plyer, win10toast, notifu를 시도했지만 모두 결국 Shell_NotifyIcon 또는 IUserNotification을 사용하고 해당 모드에서 알림을 표시하지 못합니다.

나는 발견 한 다른 스 니펫을 기반으로 한이 스 니펫으로 놀아 왔지만 주사위는 사용하지 않았습니다.

import win32api, win32con, win32gui 
import time 

class Taskbar: 
    def __init__(self): 
     self.visible = 0 
     message_map = { 
      win32con.WM_DESTROY: self.onDestroy, 
     } 

     # Register the Window class. 
     wc = win32gui.WNDCLASS() 
     hinst = wc.hInstance = win32api.GetModuleHandle(None) 
     wc.lpszClassName = "PythonTaskbar" 

     wc.lpfnWndProc = message_map 
     classAtom = win32gui.RegisterClass(wc) 

     # Create the Window. 
     style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU 
     exStyle = win32con.WS_EX_TOPMOST # win32con.WS_EX_TOOLWINDOW | win32con.WS_EX_TOPMOST #| win32con.WS_EX_NOACTIVATE 
     self.hwnd = win32gui.CreateWindowEx(exStyle, classAtom, "Taskbar Demo", style, \ 
              0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, \ 
              0, 0, hinst, None) 

     win32gui.UpdateWindow(self.hwnd) 

     icon = win32gui.LoadIcon(0, win32con.IDI_APPLICATION) 
     self.setIcon(icon) 
     self.show() 

    def setIcon(self, hicon, tooltip=None): 
     self.hicon = hicon 
     self.tooltip = tooltip 

    def showBaloon(self): 

     flags = win32gui.NIF_ICON | win32gui.NIF_MESSAGE | win32gui.NIF_INFO 
     nid = (self.hwnd, 0, flags, win32con.WM_USER + 20, self.hicon, "", "Balloon Message", 10, "Balloon", 
       win32gui.NIIF_INFO) 

     win32gui.Shell_NotifyIcon(win32gui.NIM_MODIFY, nid) 

    def show(self): 
     """Display the taskbar icon""" 
     flags = win32gui.NIF_ICON | win32gui.NIF_MESSAGE 
     if self.tooltip is not None: 
      flags |= win32gui.NIF_TIP 
      nid = (self.hwnd, 0, flags, win32con.WM_USER + 20, self.hicon, self.tooltip) 
     else: 
      nid = (self.hwnd, 0, flags, win32con.WM_USER + 20, self.hicon) 

     if self.visible: 
      self.hide() 
     win32gui.Shell_NotifyIcon(win32gui.NIM_ADD, nid) 
     self.visible = 1 

    def hide(self): 
     """Hide the taskbar icon""" 
     if self.visible: 
      nid = (self.hwnd, 0) 
      win32gui.Shell_NotifyIcon(win32gui.NIM_DELETE, nid) 
     self.visible = 0 

    def onDestroy(self, hwnd, msg, wparam, lparam): 
     self.hide() 
     win32gui.PostQuitMessage(0) # Terminate the app. 

t = Taskbar() 
time.sleep(3) 
t.showBaloon() 
time.sleep(3) 

나는 알림 창 (즉 WS_EX_TOPMOST, WS_EX_TOOLWINDOW, WS_EX_NOACTIVATE)에 대해 서로 다른 확장 윈도우 스타일을 사용하여 시도하지만 어떤 영향을 미칠 것 같지 않습니다.

알림과 함께이를 수행 할 수있는 방법이 있습니까? 전체 화면 모드가 아니기 때문에 표시하는 것이 간단하지 않아야합니까?

답변

0

Windows 알림을 사용하는 것은 불가능한 것처럼 보입니다. 어떤 플래그를 입력했는지에 상관없이 알림에 자체 플래그가 추가되어 원하는 윈도우 동작이 엉망이되었습니다. 어쨌든 나는 그 일을 할 길을 찾지 못했습니다. (1) 만 사용하여 일부 다이렉트로

  • 이 같은 ..

    1. 적절한 플래그 CreateWindowEx 함수를 사용하여이 설계, 애니 메이팅, 여러 인스턴스의 처리 행위 등을 수반 :

      만 옵션이 될 것 같다/오버레이에 대한 OpenGL 라이브러리 (아마도 전체 화면에서 작동 할 것입니다)

    2. 이 문서에 대한 정보는 없지만 일부 오버레이는 특정 프로세스에 연결하고 창을 추가하여 수행합니다. 그런 식으로 포 그라운드로 설정할 수있는 권한이 있으므로 해당 프로세스의 최상위에 머무를 수 있습니까?

    궁금한 사람들에게 나는 (1) 또는 오히려 으르렁 거리며 갔다. 그것은 gntp라는 lib로 쉽게 보낼 수있는 알림 메시지를 수신합니다. 그렇게하면 세련된 사용자 정의 알림을 쉽게 얻을 수 있습니다.