2013-10-17 106 views
3

使用pyGtk我创建了一个没有装饰的窗口。该窗口隐藏在任务栏和所有窗口的顶部。在Linux上它工作正常,但在MS Windows窗口有时它隐藏在其他窗口下,并且在Windows中始终具有“python.exe”任务栏。从MS窗口任务栏隐藏窗口

图片代表我的问题:

enter image description here

如何隐藏任务栏,从这个 “python.exe” 窗口?

我的代码:

class Infowindow(gtk.Window): 
''' 
Klasa okienka informacyjnego 
''' 
def __init__(self, json, index, destroy_cb, device): 
    gtk.Window.__init__(self) 
    self.size_x = 260+48 
    self.size_y = 85 
    self.separator_size = 10 
    self.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_SPLASHSCREEN) 
    self.set_decorated(False) 
    self.set_property('skip-taskbar-hint', True) 
    self.set_opacity(1) 
    self.set_keep_above(True) 
    self.add_events(gtk.gdk.BUTTON_PRESS_MASK) 
    self.connect("enter-notify-event", self.__on_hover) 
    self.connect("leave-notify-event", self.__on_leave) 
    self.connect("button_press_event", self.__on_click) 
    self.set_size_request(self.size_x, self.size_y) 
    color = gtk.gdk.color_parse('#f3f3f3') 
    self.modify_bg(gtk.STATE_NORMAL, color) 

    self.expanded = False 
    self.index = index 
    self.destroy_cb = destroy_cb 
    self.json = json['data'] 
    self.system_info = False if 'system' not in self.json or not self.json['system'] else True 
    self.device = device 
    f = gtk.Frame() 
    self.move_window(index) #move window to specified place 
    self.box_area = gtk.VBox() 
    self.box_area.set_spacing(10) 
    f.add(self.box_area) 
    self.add(f) 
    self.show_all() 

回答

3

你有两个选择,从任务栏删除一个窗口:

  1. 添加WS_EX_TOOLWINDOW扩展窗口风格。但是这有其他后果,我不能说他们是否认真。
  2. 给窗口一个不可见的所有者。这允许你自由地使用你想要的任何窗口样式和扩展样式,但确实涉及更多的工作。

很自然,你的窗户将在其他窗户下方。这就是窗户的工作原理。如果您想让窗口显示在顶部,请使用HWND_TOPMOST进行显示。

我不知道这是如何(或不)在PyGtk下实现的。我刚给你的Win32答案!

+0

如果不会有更多的答案我会尝试在win32gui下创建这个窗口。谢谢。 – DrafFter

5

再次感谢David Heffernan。完美的作品!

适合想要python完整解决方案的人。

  • 名称您windowin例如典型的方式: 'alamakota'
  • 使用find_window( 'alamakota'),
  • 按照给定的处理器使用hide_from_taskbar(处理器)
  • 最后使用set_topmost(处理器)

窗口对任务栏是隐藏的,它在顶部。

我知道这不是一个好的代码,但在Windows XP及更高版本上运行良好。

import ctypes 
import win32gui 
import win32api 
from win32con import SWP_NOMOVE 
from win32con import SWP_NOSIZE 
from win32con import SW_HIDE 
from win32con import SW_SHOW 
from win32con import HWND_TOPMOST 
from win32con import GWL_EXSTYLE 
from win32con import WS_EX_TOOLWINDOW 

@staticmethod 
def find_window(name): 
    try: 
     return win32gui.FindWindow(None, name) 
    except win32gui.error: 
     print("Error while finding the window") 
     return None 

@staticmethod 
def hide_from_taskbar(hw): 
    try: 
     win32gui.ShowWindow(hw, SW_HIDE) 
     win32gui.SetWindowLong(hw, GWL_EXSTYLE,win32gui.GetWindowLong(hw, GWL_EXSTYLE)| WS_EX_TOOLWINDOW); 
     win32gui.ShowWindow(hw, SW_SHOW); 
    except win32gui.error: 
     print("Error while hiding the window") 
     return None 

@staticmethod 
def set_topmost(hw): 
    try: 
      win32gui.SetWindowPos(hw, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE) 
    except win32gui.error: 
     print("Error while move window on top") 
+0

'hide_from_taskbar'似乎不适用于Win7 x64。 MSDN说应该使用'SetWindowLongPtrW'来代替。 –

+0

使用'SetWindowLongPtrW'时,它在设置'SW_HIDE'时从任务栏中隐藏,但它会再次出现在任务栏中并带有'SW_SHOW'! –

+0

我可以得到它的工作。这是我的错字。感谢您的详细代码。 –