Seite 1 von 1

Toobar mit Windows DLL Funktionen ? SHAppBarMessage?

Verfasst: Montag 2. April 2007, 20:02
von Hand
Ich glaube ich mache schon was Grundlegendes falsch, ich will auf dem Desktop eine Toolbar anzeigen.
Also das Arbeitsplatz Icon soll nach unten rücken und für meinen Frame platz machen :?

Code: Alles auswählen

import wx
import ctypes
import ctypes.wintypes
import win32ui

ABM_NEW = 0x0
ABM_REMOVE = 0x1
ABM_QUERYPOS = 0x2
ABM_SETPOS = 0x3
ABM_GETSTATE = 0x4
ABM_GETTASKBARPOS  = 0x5
ABM_ACTIVATE = 0x6
ABM_GETAUTOHIDEBAR = 0x7
ABM_SETAUTOHIDEBAR = 0x8
ABM_WINDOWPOSCHANGED = 0x9

class APPBARDATA(ctypes.Structure):
    _fields_ = [
        ("cbSize",ctypes.wintypes.DWORD),
        ("hWnd",ctypes.wintypes.HWND),
        ("uCallbackMessage", ctypes.c_ulong),
        ("uEdge", ctypes.c_ulong),
        ("rc", ctypes.wintypes.RECT),
        ("lParam",ctypes.wintypes.LPARAM),
        ]
    def __repr__(self):
        return """%s { %s }"""%(
            self.__class__.__name__,
            ", ".join(
                [ "%s=%r"%(field[0],getattr(self,field[0]))
                    for field in self._fields_
                ]
            ),
        )
    __str__ = __repr__


class myApp(wx.App):
  def OnInit(self):
    screen = wx.GetDisplaySize()
    frame = wx.Frame(None, -1, 'Test', (0,0), (screen[0],25), wx.RAISED_BORDER)
    panel = wx.Choice(frame)
    frame.Show()
    return True

app = myApp(0)

hwnd = win32ui.FindWindow(None, 'Test').GetSafeHwnd()

PAPPBARDATA = ctypes.POINTER(APPBARDATA)
pointer = PAPPBARDATA()
pointer.hWnd = hwnd
ctypes.windll.shell32.SHAppBarMessage(ABM_NEW, pointer)

app.MainLoop()


=============== Running Profile: Python ===============

---------------------------------------------------------------------------
Commandline: C:\dev\Python25\pythonw.exe E:\Projekte\Python\LAUNCH~1\app.py
Workingdirectory: E:\Projekte\Python\LAUNCH~1
Timeout: 0 sec, Delay: 0 sec, Started: 04.02.07 21:02:13
---------------------------------------------------------------------------

Traceback (most recent call last):
  File "E:\Projekte\Python\LAUNCH~1\app.py", line 54, in <module>
    ctypes.windll.shell32.SHAppBarMessage(ABM_NEW, pointer)
WindowsError: exception: access violation reading 0x00000000

Process "Python25" completed with Exit Code 1, at 04.02.07 21:02:14.


Verfasst: Montag 2. April 2007, 20:26
von rayo
Hi

Bitte nenn diese Namen anders, das ist ja schrecklich zum lesen (APPBARDATA, PAPPBARDATA) sowas ist viel angenehmer: app_bar_data

Dann in der Zeile 52, erstellst du einen Pointer ohne Parameter. Laut der ctypes Doku wird so ein Nullpointer erstellt, du müsstest als 1. Parameter eine APPBARDATA Instanz übergeben.

Lass POINTER weg wenn du den Pointer nur übergeben musst und mach es mit byref, ist einfacher für dich und kommt aufs selbe raus.

Etwa so:

Code: Alles auswählen

bar_data = APPBARDATA()
bar_data.hWnd = hwnd
ctypes.windll.shell32.SHAppBarMessage(ABM_NEW, ctypes.byref(bar_data))
Gruss