WinAPI Library (Snippets) (1163 Beispielcodes)

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: WinAPI Library (Snippets) (548)

Beitrag von Rudi »

So einen SysTrayIconBalloonTip habe ich neulich nicht finden können. Hier ist ein Code, wie er so oder so ähnlich im Forum öfters zu finden ist. Ich weiß allerdings nicht, ob er auch unter Win7 geht. Das nId\cbSize wird ab Vista möglicherweise per SizeOf(NOTIFYICONDATA_) ermittelt.

Code: Alles auswählen

Structure NOTIFYICONDATA_
  cbSize.l
  hwnd.i
  uId.l
  uFlags.l
  uCallbackMessage.l
  hIcon.i
  StructureUnion
    szTip.c[64]
    szTipEx.c[128]
  EndStructureUnion
  dwState.l
  dwStateMask.l
  szInfo.c[256]
  StructureUnion
    uTimeout.l
    uVersion.l
  EndStructureUnion
  szInfoTitle.c[64]
  dwInfoFlags.l
  guidItem.GUID
  hBalloonIcon.i
EndStructure

Procedure SysTrayIconBalloon(uId, hWindow, Title$, Message$, timeOut, flags)
  Protected nId.NOTIFYICONDATA_
  If OSVersion() >= #PB_OS_Windows_Vista
    nId\cbSize = 508
  ElseIf OSVersion() >= #PB_OS_Windows_XP
    nId\cbSize = 504
  ElseIf OSVersion() >= #PB_OS_Windows_2000
    nId\cbSize = 488
  Else
    nId\cbSize = 88
  EndIf
  If nId\cbSize
    nId\uVersion    = 4
    Shell_NotifyIcon_(#NIM_SETVERSION, @nId)
    nId\uId         = uId
    nId\hwnd        = hWindow
    nId\dwInfoFlags = flags
    nId\uFlags      = #NIF_INFO
    nId\uTimeout    = timeOut
    PokeS(@nId\szInfo, Message$, SizeOf(nId\szInfo))
    PokeS(@nId\szInfoTitle, Title$, SizeOf(nId\szInfoTitle))
    ProcedureReturn Shell_NotifyIcon_(#NIM_MODIFY, @nId)
  EndIf
  ProcedureReturn #False
EndProcedure

If OpenWindow(0,#PB_Ignore,#PB_Ignore,200,200,"BalloonTip",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  AddSysTrayIcon(0, WindowID(0), ExtractIcon_(0,"explorer.exe",3))
  SysTrayIconBalloon(0, WindowID(0),"BalloonTip 1!","BalloonTip wechselt in drei Sekunden!",100,#NIIF_INFO)
  Delay(3000)
  SysTrayIconBalloon(0, WindowID(0),"BalloonTip 2!","BalloonTip verschwindet gleich!",100,#NIIF_WARNING)
  Delay(3000)
  SysTrayIconBalloon(0, WindowID(0),"","",100,#NIIF_INFO)
  Delay(1000)
EndIf
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: WinAPI Library (Snippets) (548)

Beitrag von edel »

Rudi hat geschrieben:Das nId\cbSize wird ab Vista möglicherweise per SizeOf(NOTIFYICONDATA_) ermittelt.
Wird man so oder so benutzen muessen, da es sonst mit Unicode nicht funktioniert.

Code: Alles auswählen

        PokeS(@nId\szInfo, Message$, SizeOf(nId\szInfo))
        PokeS(@nId\szInfoTitle, Title$, SizeOf(nId\szInfoTitle))
Das fuehrt frueher oder spaeter zu einem Fehler, da der String gar nicht so lang sein muss, wie in die Struktur passt.

Richtig waere es so

Code: Alles auswählen

        PokeS(@nId\szInfo, Message$)
        PokeS(@nId\szInfoTitle, Title$)
Alternativ kannst du auch .s{x} benutzen.

Code: Alles auswählen

Structure NOTIFYICONDATA_
    [...]    
    szInfo.s{256}
    [...]
EndStructure

    [...]
    nId\szInfo      = Message$
    [...]

Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: WinAPI Library (Snippets) (548)

Beitrag von Rudi »

@edel
Danke schon mal für die Hilfe.
Wird man so oder so benutzen muessen, da es sonst mit Unicode nicht funktioniert.
Vielleicht könnte noch ein Vista und/oder Win7 - Nutzer testen, ob das so funktioniert!
***Edit: Habe nochmal den gesamten Code mit den von edel vorgeschlagenen Veränderungen reinkopiert. Vielleicht erbarmt sich noch jemand; es ist doch für die WinAPI Library!

Code: Alles auswählen

Structure NOTIFYICONDATA_
  cbSize.l
  hwnd.i
  uId.l
  uFlags.l
  uCallbackMessage.l
  hIcon.i
  StructureUnion
    szTip.c[64]
    szTipEx.c[128]
  EndStructureUnion
  dwState.l
  dwStateMask.l
  szInfo.s{256}
  StructureUnion
    uTimeout.l
    uVersion.l
  EndStructureUnion
  szInfoTitle.c[64]
  dwInfoFlags.l
  guidItem.GUID
  hBalloonIcon.i
EndStructure

Procedure SysTrayIconBalloon(uId, hWindow, Title$, Message$, timeOut, flags)
  Protected nId.NOTIFYICONDATA_
  If OSVersion() >= #PB_OS_Windows_Vista
    nId\cbSize = SizeOf(NOTIFYICONDATA_)
  ElseIf OSVersion() >= #PB_OS_Windows_XP
    nId\cbSize = 504
  ElseIf OSVersion() >= #PB_OS_Windows_2000
    nId\cbSize = 488
  Else
    nId\cbSize = 88
  EndIf
  If nId\cbSize
    nId\uVersion    = 4
    Shell_NotifyIcon_(#NIM_SETVERSION, @nId)
    nId\uId         = uId
    nId\hwnd        = hWindow
    nId\dwInfoFlags = flags
    nId\uFlags      = #NIF_INFO
    nId\uTimeout    = timeOut
    nId\szInfo      = Message$
    PokeS(@nId\szInfo, Message$)
    PokeS(@nId\szInfoTitle, Title$)
    ProcedureReturn Shell_NotifyIcon_(#NIM_MODIFY, @nId)
  EndIf
  ProcedureReturn #False
EndProcedure

If OpenWindow(0,#PB_Ignore,#PB_Ignore,200,200,"BalloonTip",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  AddSysTrayIcon(0, WindowID(0), ExtractIcon_(0,"explorer.exe",3))
  SysTrayIconBalloon(0, WindowID(0),"BalloonTip 1!","BalloonTip wechselt in drei Sekunden!",100,#NIIF_INFO)
  Delay(3000)
  SysTrayIconBalloon(0, WindowID(0),"BalloonTip 2!","BalloonTip verschwindet gleich!",100,#NIIF_WARNING)
  Delay(3000)
  SysTrayIconBalloon(0, WindowID(0),"","",100,#NIIF_INFO)
  Delay(1000)
EndIf
Das hier ist die entscheidende Zeile für Vista und Win7:

Code: Alles auswählen

nId\cbSize = SizeOf(NOTIFYICONDATA_)
Unter XP funktioniert der Code.
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: WinAPI Library (Snippets) (548)

Beitrag von RSBasic »

Hallo Rudi,


vielen Dank für deinen Code.
Unter Windows 7 funktioniert der Code einwandfrei.
Habs in meiner WinAPI-L.-Warteschlange hinzugefügt.

Und danke an edel für die Anpassung.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: WinAPI Library (Snippets) (548)

Beitrag von Bisonte »

Auf Win7 x64 läufts auch. :allright:

Hab grad heute nach soetwas suchen müssen, da ich mal schnell einen DyndnsUpdaterersatz bauen musste... ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: WinAPI Library (Snippets) (548)

Beitrag von Falko »

Funktioniert bei mir auch unter Vista Ultimate 32-Bit.
Da ich Vista 64-Bit runter geschmissen habe, kann ich das
leider nicht mehr testen.

Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: WinAPI Library (Snippets) (548)

Beitrag von edel »

Unter Windows 64 bit funktioniert es nicht.
Andreas21
Beiträge: 390
Registriert: 30.08.2004 09:05
Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64
Wohnort: Heidelberg

Re: WinAPI Library (Snippets) (548)

Beitrag von Andreas21 »

Unter Windows 7 leuft es.
Aber nur unter 32 Bit.
Bei 64 bit gehts nicht.
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: WinAPI Library (Snippets) (548)

Beitrag von Rudi »

Bitte nochmal testen auf x64:
Edit: Struktur geändert!

Code: Alles auswählen

Structure NOTIFYICONDATA_
  cbSize.l
  hwnd.l
  uID.l
  uFlags.l
  uCallbackMessage.l
  hIcon.l
  szTip.s{128}
  dwState.l
  dwStateMask.l
  szInfo.s{256}
  StructureUnion
    uTimeout.l
    uVersion.l
  EndStructureUnion
  szInfoTitle.s{64}
  dwInfoFlags.l
  guidItem.GUID
  hBalloonIcon.i
EndStructure

Procedure SysTrayIconBalloon(uId, hWindow, Title$, Message$, timeOut, flags)
  Protected nId.NOTIFYICONDATA_
  If OSVersion() >= #PB_OS_Windows_Vista
    nId\cbSize = SizeOf(NOTIFYICONDATA_)
  ElseIf OSVersion() >= #PB_OS_Windows_XP
    nId\cbSize = #NOTIFYICONDATA_V3_SIZE
  ElseIf OSVersion() >= #PB_OS_Windows_2000
    nId\cbSize = #NOTIFYICONDATA_V2_SIZE
  Else
    nId\cbSize = #NOTIFYICONDATA_V1_SIZE
  EndIf
  If nId\cbSize
    nId\uVersion    = 4
    Shell_NotifyIcon_(#NIM_SETVERSION, @nId)
    nId\uId         = uId
    nId\hwnd        = hWindow
    nId\dwInfoFlags = flags
    nId\uFlags      = #NIF_INFO
    nId\uTimeout    = timeOut
    nId\szInfo      = Message$
    nId\szInfoTitle = Title$
    ProcedureReturn Shell_NotifyIcon_(#NIM_MODIFY, @nId)
  EndIf
  ProcedureReturn #False
EndProcedure

If OpenWindow(0, #PB_Ignore, #PB_Ignore, 200, 200, "BalloonTip", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  AddSysTrayIcon(0, WindowID(0), ExtractIcon_(0, "explorer.exe", 3))
  SysTrayIconBalloon(0, WindowID(0), "BalloonTip 1!", "BalloonTip wechselt in drei Sekunden!", 100, #NIIF_INFO)
  Delay(3000)
  SysTrayIconBalloon(0, WindowID(0), "BalloonTip 2!", "BalloonTip verschwindet gleich!", 100, #NIIF_WARNING)
  Delay(3000)
  SysTrayIconBalloon(0, WindowID(0), "", "", 100, #NIIF_NONE)
  Delay(1000)
EndIf
End
Zuletzt geändert von Rudi am 09.10.2010 22:23, insgesamt 1-mal geändert.
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: WinAPI Library (Snippets) (548)

Beitrag von ts-soft »

Unter Windows 64 bit funktioniert es nicht.

Kein Wunder bei der falschen Struktur :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten