Email to Torsten Weber
Feed Icon
.NET User Group Leipzig

Ich habe mich, seitdem Uwe Baumann in Leipzig war und eines meiner Makros für seinen TechTalk "Schneller codieren – Visual Studio .NET Extensibility" gegen eine Lizenz (ein Bier) verwendet hat, nicht weiter großartig mit der Programmierung von Makros für Visual Studio 2003 oder Visual Studio 2005 beschäftigt. Wozu auch, denn mit Werkzeugen wie ReSharper von JetBrains, von dem man übrigens beim Vortrag von Roland Weigelt über die Erweiterbarkeit von Visual Studio eine Lizenz gewinnen kann, kann viel fehlende Funktionalität von Visual Studio erschlagen werden. Bei Visual Studio 2003, übrigens auch bei Visual Studio 2005, wurde dem Softwareentwickler zugemutet, einzelne Ordner in der Projektmappe selber wieder zu schließen. Über das Kontextmenü ging das nicht. Also musste ein Makro her, welches das übernommen hat. So weit so gut zu dem Makro für Uwe's TechTalk.

Geöffnete Ordner in Visual Studio 2005 – diesselben Probleme wie in Visual Studio 2003
Abb. 1: Geöffnete Ordner in Visual Studio 2005.

Bei Visual Studio 2005 vermisse ich die Unterstützung von Ereignissen für Sounds. Visual Studio 2003 konnte das für die vielfältigsten Ereignisse, Visual Studio 2005 kann es nur noch, wenn ein Haltepunkt erreicht wird. Bei mittleren bis großen Softwareentwicklungsprojekten ist das durchaus für den einen oder andern ärgerlich, weil trotz und gerade deswegen, wegen Mehrkernprozessoren, 4 GB RAM und mehr, 1 TB RAID 0+1 und höher, Builds zwar noch ihre Zeit brauchen, aber man bequem weiterarbeiten kann. Ohne Feedback, ähnlich wie bei einer Tastatur die Taktilität, muss man ein ungefähres Zeitgefühl haben oder in Visual Studio nach dem Status eines Builds ständig nachschauen. Vielleicht rüstet Microsoft es ja auch im nächsten Service Pack für Visual Studio 2005 wieder nach? Wer weiß das schon so genau, daher habe ich ein Makro geschrieben.

Audioereignisse bei Visual Studio 2005
Abb. 2: Audioereignisse bei Visual Studio 2005 – nur noch für Haltepunkte.

Im Gegensatz zu einer Lösung im Web, überprüft mein Makro nicht die Zeichenfolge im Ausgabe-Fenster von Visual Studio 2005, sondern arbeitet über BuildEvents_OnBuildProjConfigDone(...) Handles BuildEvents.OnBuildProjConfigDone {4} mit Ereignissen aufgrund von angestoßenen Builds eines Projektes. Ist der Build eines Projektes erfolgreich, wird die Datei C:\Windows\Media\chimes.wav {2} abgespielt. Hakt es irgendwo und der Build klappt nicht, dagegen die Datei C:\Windows\Media\Windows Critical Stop.wav {3}. Ein sinnvoller Einsatz des Makros liegt außerdem darin, gleich den kompletten Build einer Lösung anzuhalten, wenn ein Build eines Projektes daraus nicht erfolgreich ist und zwar mit: DTE.ExecuteCommand("Build.Cancel") {5}. Damit nicht bei jedem Build eines Projektes, sondern nur bei der Lösung als solches eine Datei abgespielt wird, muss noch mit der Variable canceled {6, 8, 9} gearbeitet und die Entscheidung, welche Datei abzuspielen ist, in der Methode BuildEvents_OnBuildDone {7} getroffen werden.

Option Strict Off ... Public Module EnvironmentEvents {1} ... Declare Function PlaySound Lib "winmm.dll" Alias "sndPlaySoundA" _
(ByVal lpszSoundName As String, ByVal uFlags As Long) As Long Const BuildSucceedWaveFile = "C:\Windows\Media\chimes.wav" {2} Const BuildFailedWaveFile = "C:\Windows\Media\Windows Critical Stop.wav" {3} Dim canceled As Boolean = False Private Sub BuildEvents_OnBuildProjConfigDone( _ {4} ByVal Project As String, ByVal ProjectConfig As String, _ ByVal Platform As String, ByVal SolutionConfig As String, _ ByVal Success As Boolean) _ Handles BuildEvents.OnBuildProjConfigDone If Success = False Then DTE.ExecuteCommand("Build.Cancel") {5} canceled = True {6} End If End Sub Private Sub BuildEvents_OnBuildDone(ByVal Scope As EnvDTE.vsBuildScope, _ {7} ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildDone If Not canceled Then {8} PlayWaveFile(BuildSucceedWaveFile) Else PlayWaveFile(BuildFailedWaveFile) End If canceled = False {9} End Sub Private Sub PlayWaveFile(ByVal soundFile As String) PlaySound(soundFile, &H1 Or &H2) End Sub End Module

Danke an Dirk Primbs, der gerade auf VB abfährt, für den Tipp zu Handles. Es war dann doch viel einfacher als gedacht, dass Makro muss in EnvironmentEvents {1} eingefügt werden. Wo findet man das? Über den Makro-Explorer in Visual Studio [ALT + F8] und dort einfach auf das entsprechende Makro doppelt klicken.

EvironmentsEvents – Ort für die Reaktion auf Ereignisse in Makros bei Visual Studio 2005
Abb. 3: In EvironmentsEvents muss das Makro eingefügt werden.

Makro-Explorer in Visual Studio 2005
Abb. 4: Makro-Explorer in Visual Studio 2005.

PS: Nein Alex, das ist kein VBA. ;)

Declare Function PlaySound Lib "winmm.dll" Alias "sndPlaySoundA" _
   (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
Const BuildSucceedWaveFile = "C:\Windows\Media\chimes.wav"
Const BuildFailedWaveFile = "C:\Windows\Media\Windows Critical Stop.wav"
Dim canceled As Boolean = False

Private Sub BuildEvents_OnBuildProjConfigDone( _
    ByVal Project As String, ByVal ProjectConfig As String, _
    ByVal Platform As String, ByVal SolutionConfig As String, _
    ByVal Success As Boolean) _
    Handles BuildEvents.OnBuildProjConfigDone

    If Success = False Then
        DTE.ExecuteCommand("Build.Cancel")
        canceled = True
    End If
End Sub

Private Sub BuildEvents_OnBuildDone(ByVal Scope As EnvDTE.vsBuildScope, _
    ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildDone
    If Not canceled Then
        PlayWaveFile(BuildSucceedWaveFile)
    Else
        PlayWaveFile(BuildFailedWaveFile)
    End If

    canceled = False
End Sub

Private Sub PlayWaveFile(ByVal soundFile As String)
    PlaySound(soundFile, &H1 Or &H2)
End Sub
Download (1,07 KB)
All comments require the approval of the site owner before being displayed.
Name
E-mail
(will show your gravatar icon)
Home page

Comment (Some html is allowed: a@href@title, b, blockquote@cite, em, i, strike, strong, sub, sup, u) where the @ means "attribute." For example, you can use <a href="" title=""> or <blockquote cite="Scott">.  

Live Comment Preview

Boldness, risk‐taking and a little bit of craziness – lateral thinker Torsten Weber
Boldness, risk‐taking and a little bit of craziness – lateral thinker Torsten Weber

Torsten Weber is a MVP for Device Application Development

Calendar of the .NET User Group Leipzig

Microsoft Community Leader/Insider Program

Programmieren mit dem .NET Compact Framework. Anwendungsentwicklung für mobile Geräte.
Inhaltsverzeichnis & mehr

Programmieren mit dem .NET Compact Framework 3.5. Anwendungsentwicklung für mobile Geräte.

Microsoft – change the mobile world or go home!

Categories

Calendar

<October 2008>
SunMonTueWedThuFriSat
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

Archive

My subscribed blogs

show all
show less
Blogs of good friends (as OPML)
More Blogs (as OPML)
RSS: .NET Casts .NET Casts
RSS: .NET Compact Framework Team .NET Compact Framework Team
RSS: Alan Cameron Wills Alan Cameron Wills
RSS: Alex Feinman Alex Feinman
RSS: Alex Januschewsky Alex Januschewsky
RSS: Alex Yakhnin Alex Yakhnin
RSS: Alexander Wechsler Alexander Wechsler
RSS: Alexander Zeitler Alexander Zeitler
RSS: Amit Chopra Amit Chopra
RSS: Anand Balachandran Anand Balachandran
RSS: Anthony Wong Anthony Wong
RSS: Ausgefallene Gadgets & Ideen Ausgefallene Gadgets & Ideen
RSS: Barry Bond Barry Bond
RSS: Boas Enkler Boas Enkler
RSS: Calvin Hsia Calvin Hsia
RSS: Chris Eberl Chris Eberl
RSS: Chris Lorton Chris Lorton
RSS: Chris Tacke Chris Tacke
RSS: Christian Weyer Christian Weyer
RSS: Christopher Fairbairn Christopher Fairbairn
RSS: ComputerBase News ComputerBase News
RSS: Cordula Lochmann Cordula Lochmann
RSS: Dan Elliot Dan Elliot
RSS: Daniel Chong Jyh Tar Daniel Chong Jyh Tar
RSS: Daniel Fisher Daniel Fisher
RSS: Daniel Melanchthon Daniel Melanchthon
RSS: Daniel Moth Daniel Moth
RSS: Dave Baker Dave Baker
RSS: David Kline David Kline
RSS: Dirk Primbs Dirk Primbs
RSS: DotNetGerman Bloggers DotNetGerman Bloggers
RSS: e-commerce blog e-commerce blog
RSS: Erich Holzbauer Erich Holzbauer
RSS: Florian Mätschke Florian Mätschke
RSS: Frank Fischer Frank Fischer
RSS: Gareth Jones Gareth Jones
RSS: George Mathew George Mathew
RSS: Gurbir Singh Gurbir Singh
RSS: Guy Burstein Guy Burstein
RSS: Hannes Preishuber Hannes Preishuber
RSS: Hard Tecs 4U News Hard Tecs 4U News
RSS: Heike Scholz Heike Scholz
RSS: heise online News heise online News
RSS: HoppeRx HoppeRx
RSS: IE Mobile Team Weblog IE Mobile Team Weblog
RSS: Inside Bennie Inside Bennie
RSS: Inside Microsoft Inside Microsoft
RSS: Jack Greenfield Jack Greenfield
RSS: James Pratt James Pratt
RSS: Jason Hogg Jason Hogg
RSS: Jason Langridge Jason Langridge
RSS: Jens Häupel Jens Häupel
RSS: Jezz Santos Jezz Santos
RSS: Jim Wilson Jim Wilson
RSS: Johanna Merhof  Johanna Merhof
RSS: José Gallardo Salazar José Gallardo Salazar
RSS: Josh Heitzman Josh Heitzman
RSS: Kai Gloth Kai Gloth
RSS: Kevin Daly Kevin Daly
RSS: Lao K Lao K
RSS: Loke Uei Tan Loke Uei Tan
RSS: Maarten Struys Maarten Struys
RSS: Marcus Perryman Marcus Perryman
RSS: Mark Arteaga Mark Arteaga
RSS: Mark Ihimoyan Mark Ihimoyan
RSS: Mark Prentice Mark Prentice
RSS: Markus Beckedahl Markus Beckedahl
RSS: Markus Hage Markus Hage
RSS: Markus Zeischke Markus Zeischke
RSS: Martin Fowler Martin Fowler
RSS: Mathias Raacke Mathias Raacke
RSS: Mel Sampat Mel Sampat
RSS: Michael Korp Michael Korp
RSS: Michael Saffitz Michael Saffitz
RSS: Mike Hall Mike Hall
RSS: Mike Temporale Mike Temporale
RSS: Mike Zintel Mike Zintel
RSS: Mobile Developer Center Mobile Developer Center
RSS: Mobile Tagging Mobile Tagging
RSS: MozBackup MozBackup
RSS: MS Mobiles MS Mobiles
RSS: MSDN Forum .NET CF MSDN Forum .NET CF
RSS: MSDN Forum Device Emulator MSDN Forum Device Emulator
RSS: MSDN Forum Smart Devices C#/VB MSDN Forum Smart Devices C#/VB
RSS: MSDN Forum Smart Devices MSDN Forum Smart Devices
RSS: MVP Global Summit 2008 MVP Global Summit 2008
RSS: Nazim Lala Nazim Lala
RSS: Neil Cowburn Neil Cowburn
RSS: Neno Loje Neno Loje
RSS: Nils Müller Nils Müller
RSS: Nino Benvenuti Nino Benvenuti
RSS: Norbert Eder Norbert Eder
RSS: Oliver Block Oliver Block
RSS: Oliver Scheer Oliver Scheer
RSS: OrbLog OrbLog
RSS: Outlook Mobile Team Blog Outlook Mobile Team Blog
RSS: OVIDEO (Kino) OVIDEO (Kino)
RSS: OVIDEO (Trailer) OVIDEO (Trailer)
RSS: Pedro Silva Pedro Silva
RSS: Peter Foot Peter Foot
RSS: Peter Kirchner Peter Kirchner
RSS: Rabi Satter Rabi Satter
RSS: Ralf Westphal Ralf Westphal
RSS: Rob Tiffany Rob Tiffany
RSS: Rod Drury Rod Drury
RSS: Roger Schäffeler Roger Schäffeler
RSS: Roman Batoukov Roman Batoukov
RSS: Scott Guthrie Scott Guthrie
RSS: Scott Holden Scott Holden
RSS: Sebastian Weber Sebastian Weber
RSS: Simon Hackfort Simon Hackfort
RSS: Smartphone-Web Smartphone-Web
RSS: Sriram Krishnan Sriram Krishnan
RSS: Stephen Fry Stephen Fry
RSS: Steve Cook Steve Cook
RSS: Steve Hegenderfer Steve Hegenderfer
RSS: Steven Kelly Steven Kelly
RSS: Steven Pratschner Steven Pratschner
RSS: Stuart Kent Stuart Kent
RSS: Sue Loh Sue Loh
RSS: Thomas Schissler Thomas Schissler
RSS: Tom Hollander Tom Hollander
RSS: Vik Thairani Vik Thairani
RSS: Visual Studio For Devices Team Visual Studio For Devices Team
RSS: We-Dig.org We-Dig.org
RSS: Windows Mobile Team Blog Windows Mobile Team Blog
RSS: Xin Yan Xin Yan