{"id":55000369,"date":"2023-06-01T00:00:00","date_gmt":"2023-06-21T11:41:24","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=369"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Outlook_Kontextmenues_anpassen","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Outlook_Kontextmenues_anpassen\/","title":{"rendered":"Outlook: Kontextmen&uuml;s anpassen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/a5faed59ee614a7ba846ddef72c540b8\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>In den Office-Anwendungen Word, Excel oder Access passen wir vorhandene Kontextmen&uuml;s per VBA &uuml;ber das Objektmodell von Office an. Auch das Hinzuf&uuml;gen und die Anzeige benutzerdefinierter Kontextmen&uuml;s erledigen wir auf diese Weise. Unter Outlook sieht die Situation anders aus: Hier wurde die Definition von Kontextmen&uuml;s bereits in die Ribbondefinition integriert. Wir haben dort einen eigenen Abschnitt namens &#8220;contextMenu&#8221; mit dem wir vorhandene Kontextmen&uuml;s anpassen und erweitern k&ouml;nnen. In diesem Artikel schauen wir uns an, wie wir solche Anpassungen vornehmen und welche M&ouml;glichkeiten sich daraus ergeben.<\/b><\/p>\n<h2>Kontextmen&uuml;s in Outlook<\/h2>\n<p>Outlook bietet genau wie die &uuml;brigen Office-Anwendungen eine Reihe von Kontextmen&uuml;s, die f&uuml;r die verschiedensten Elemente oder Bereiche aufgerufen werden k&ouml;nnen. In Bild 1 sehen wir beispielsweise das Kontextmen&uuml; f&uuml;r eine E-Mail.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_369_001.png\" alt=\"Ein Kontextmen&uuml; in Outlook\" width=\"549,6265\" height=\"340,4857\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Ein Kontextmen&uuml; in Outlook<\/span><\/b><\/p>\n<h2>Technik zum Anpassen<\/h2>\n<p>Die schlechte Nachricht ist: Kontextmen&uuml;s unter Outlook lassen sich nur per COM-Add-In anpassen. Die gute ist: Die Basis daf&uuml;r haben wir bereits in einem weiteren Artikel namens <b>Outlook: Ribbon per COM-Add-In anpassen <\/b>(<b>www.vbentwickler.de\/376<\/b>) gelegt. Dort haben wir mit dem Tool <b>twinBASIC<\/b> bereits ein COM-Add-In erstellt, mit dem wir die normalen Ribbonelemente anpassen k&ouml;nnen, also die <b>tab<\/b>-, <b>group<\/b>&#8211; oder <b>button<\/b>-Elemente im Ribbon von Outlook. Dort haben wir auch bereits die Besonderheit hervorgehoben, dass Outlook als einzige Office-Anwendung mehrere Fenster mit jeweils einem eigenen Ribbon hat. Auch dies ist beim Anpassen von Kontextmen&uuml;s zu ber&uuml;cksichtigen. <\/p>\n<h2>Anpassen oder auch neue Kontextmen&uuml;s definieren?<\/h2>\n<p>Die n&auml;chste Frage, die wir uns stellen m&uuml;ssen: K&ouml;nnen wir nur bestehende Kontextmen&uuml;s erweitern oder auch neue Kontextmen&uuml;s erstellen? Unter Access beispielsweise kann man auf das Bet&auml;tigen der rechten Maustaste per Ereignisprozedur reagieren und per VBA ein neues Kontextmen&uuml; zusammenstellen und dieses auch anzeigen. Probieren wir also aus, ob wir auch in Outlook benutzerdefinierte Kontextmen&uuml;s per VBA erstellen k&ouml;nnen. Dazu f&uuml;gen wir die folgende Prozedur in ein neues Modul im VBA-Editor von Outlook ein und  f&uuml;hren sie aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>KontextmenueAnlegen()\r\n     <span style=\"color:blue;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>CommandBar\r\n     <span style=\"color:blue;\">Dim <\/span>cbb<span style=\"color:blue;\"> As <\/span>CommandBarButton\r\n     <span style=\"color:blue;\">Set<\/span> cbr = Application.CommandBars.Add( _\r\n         \"Benutzerdefiniert\", msoBarPopup, , <span style=\"color:blue;\">True<\/span>)\r\n     ...\r\n     cbr.ShowPopup\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur scheitert bereits bei Verwendung der <b>CommandBars<\/b>-Auflistung. Diese liefert den Fehler <b>Objekt unterst&uuml;tzt diese Eigenschaft oder Methode nicht<\/b>.<\/p>\n<h2>Kontextmen&uuml; anpassen<\/h2>\n<p>Wir m&uuml;ssen uns beim Anpassen des Kontextmen&uuml;s also offensichtlich auf das Erweitern oder &Auml;ndern von eingebauten Elementen beschr&auml;nken. Wir schauen uns an einem Beispiel an, wie das grunds&auml;tzlich funktioniert. Dabei gehen wir davon aus, dass wir schon ein COM-Add-In wie im Artikel <b>Outlook: Ribbon per COM-Add-In anpassen <\/b>(<b>www.vbentwickler.de\/376<\/b>) beschrieben erstellt haben.<\/p>\n<p>F&uuml;r dieses brauchen wir zun&auml;chst nur die Funktion <b>GetCustomUI <\/b>anzupassen, die den Code f&uuml;r die Ribbondefinition zusammenstellt. In diesem Fall f&uuml;gen wir statt des <b>ribbon<\/b>-Elements das Element <b>contextMenus <\/b>zur Ribbondefinition hinzu (siehe Listing 1). Wir k&ouml;nnen nat&uuml;rlich auch beide gleichzeitig verwenden. Unterhalb dieses Elements legen wir f&uuml;r jedes Kontextmen&uuml;, das wir anpassen wollen, ein <b>contextMenu<\/b>-Element an.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>GetCustomUI(ByVal RibbonID<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span> Implements IRibbonExtensibility.GetCustomUI\r\n     <span style=\"color:blue;\">Dim <\/span>strXML<span style=\"color:blue;\"> As String<\/span>\r\n     strXML &= \"&lt;customUI xmlns=\"\"http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui\"\" loadImage=\"\"LoadImage\"\"&gt;\" _\r\n         & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"  &lt;contextMenus&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"    &lt;contextMenu idMso=\"\"ContextMenuText\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"      &lt;button id=\"\"btn\"\" label=\"\"Beispielbutton\"\" onAction=\"\"onAction\"\" image=\"\"add.ico\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"    &lt;\/contextMenu&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"  &lt;\/contextMenus&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"&lt;\/customUI&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     Return strXML\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Zusammenstellen einer Ribbondefinition zur Erweiterung eines Kontextmen&uuml;s<\/span><\/b><\/p>\n<p>Um festzulegen, welches Kontextmen&uuml; wir anpassen wollen, ben&ouml;tigen wir die <b>idMso <\/b>des Elements. In diesem Fall nutzen wir den Wert <b>ContextMenuText<\/b>. Dieses Kontextmen&uuml; erscheint beispielsweise, wenn wir mit der rechten Maustaste in den Entwurf einer E-Mail klicken (wie wir an den Namen der idMso f&uuml;r ein Kontextmen&uuml; kommen, beschreiben wir weiter unten).<\/p>\n<p>Wenn wir nun noch ein <b>button<\/b>-Element wie in hinzuf&uuml;gen und das COM-Add-In erstellen, sieht das entsprechende Kontextmen&uuml; wie in Bild 2 aus. Das Icon haben wir wie ebenfalls in dem oben genannten Artikel beschrieben hinzugef&uuml;gt. F&uuml;r das <b>button<\/b>-Element haben wir mit dem <b>onAction<\/b>-Attribut festgelegt, welche Prozedur beim Anklicken des Buttons aufgerufen werden soll. Diese sieht so aus:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_369_002.png\" alt=\"Benutzerdefinierter Button im Kontextmen&uuml;\" width=\"349,6267\" height=\"437,9345\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Benutzerdefinierter Button im Kontextmen&uuml;<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>OnAction(control<span style=\"color:blue;\"> As <\/span>IRibbonControl)\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Steuerelement: \" & control.Id\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies zeigt beim Bet&auml;tigen des Kontextmen&uuml;s die angegebene Meldung an und gibt den Namen des angeklickten Steuerelements aus.<\/p>\n<h2>Kontextmen&uuml;s identifizieren<\/h2>\n<p>Wenn wir ein Kontextmen&uuml; erweitern wollen, wissen wir erst einmal nicht, wie die <b>idMso <\/b>f&uuml;r das entsprechende Element hei&szlig;t. Dazu k&ouml;nnen wir die Excel-Dateien mit <b>idMso<\/b>-Werten nutzen, die Microsoft bereitgestellt hat und die wir dem Download zu diesem Artikel beigef&uuml;gt haben. Diese sind nicht aktuell &#8211; Miccrosoft stellt nicht regelm&auml;&szlig;ig neue Versionen dieser Dateien bereit. Da sich jedoch auch die Ribbons keinen umfangreichen &Auml;nderungen unterliegen, ist das erst einmal kein Problem.<\/p>\n<p>Die Namen der meisten Kontextmen&uuml;s finden wir in der Datei <b>outlookexplorercontrols.xlsx<\/b>. Hier haben wir f&uuml;r das Feld <b>ControlType<\/b> einen Filter mit dem Wert <b>contextMenu <\/b>definiert und erhalten so die Bezeichnungen aller in der Tabelle enthaltenen Kontextmen&uuml;s (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_369_003.png\" alt=\"Namen der ContextMenu-Elemente\" width=\"699,627\" height=\"304,2527\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Namen der ContextMenu-Elemente<\/span><\/b><\/p>\n<p>Wie k&ouml;nnen wir nun, abgesehen von der intuitiven Zuordnung der Bezeichnungen zu den Bereichen, herausfinden, welches contextMenu-Element in welchem Kontext angezeigt wird? <\/p>\n<p>Dazu f&uuml;gen wir einfach einem COM-Add-In allen <b>contextMenu<\/b>-Elementen einen button hinzu, der den Namen des jeweiligen <b>contextMenu<\/b>-Elements enth&auml;lt. Dazu nutzen wir unsere Kenntnisse der Excel-VBA-Programmierung und durchlaufen in einer Schleife alle Zeilen des Excel-Dokuments (siehe Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AlleKontextmenues()\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngLetzteZeile<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strXML<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strKontextmenue<span style=\"color:blue;\"> As String<\/span>\r\n     lngLetzteZeile = Sheets(1).UsedRange.SpecialCells(xlCellTypeLastCell).Row\r\n     For i = 1 To lngLetzteZeile\r\n         <span style=\"color:blue;\">If <\/span>Cells(i, 2) = \"contextMenu\"<span style=\"color:blue;\"> Then<\/span>\r\n             strKontextmenue = Cells(i, 1)\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strKontextmenue) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 strXML = strXML & \"        strXML &= \"\"    &lt;contextMenu idMso=\"\"\"\"\" & strKontextmenue & \"\"\"\"\"&gt;\"\" _\r\n                     & vbcrlf\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                 strXML = strXML & \"        strXML &= \"\"      &lt;button id=\"\"\"\"btn\" & strKontextmenue _\r\n                     & \"\"\"\"\" label=\"\"\"\"\" & strKontextmenue & \"\"\"\"\" onAction=\"\"\"\"onAction\"\"\"\" image=\"\"\"\"add.ico\"\"\"\"\/&gt;\"\" _\r\n                     & vbcrlf\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                 strXML = strXML & \"        strXML &= \"\"    &lt;\/contextMenu&gt;\"\" & vbcrlf\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     Inzwischenablage strXML\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Zusammenstellen von contextMenu-Elementen<\/span><\/b><\/p>\n<p>Dabei pr&uuml;fen wir jeweils, ob die zweite Spalte den Eintrag <b>contextMenu <\/b>enth&auml;lt. In diesem Fall stellen wir drei Codezeilen f&uuml;r das COM-Add-In zusammen, die im Ergebnis beispielsweise wie folgt aussehen (jeweils in einer Zeile):<\/p>\n<pre>strXML &= \"    &lt;contextMenu idMso=\"\"ContextMenuFolder\"\"&gt;\" & vbcrlf\r\nstrXML &= \"      &lt;button id=\"\"btnContextMenuFolder\"\" label=\"\"ContextMenuFolder\"\" onAction=\"\"onAction\"\" image=\"\"add.ico\"\"\/&gt;\" & vbcrlf\r\nstrXML &= \"    &lt;\/contextMenu&gt;\" & vbcrlf<\/pre>\n<p>Solch ein Konstrukt erstellen wir f&uuml;r alle contextMenu-Elemente und f&uuml;gen diese dann der obigen getCustomUI-Funktion hinzu. Wenn wir das COM-Add-In nun erstellen und danach Outlook erneut &ouml;ffnen, finden wir in ann&auml;hernd jedem Kontextmen&uuml; einen Eintrag vor, der den Namen des jeweiligen Kontextmen&uuml;s enth&auml;lt (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_369_004.png\" alt=\"Kontextmen&uuml; eines Spaltenkopfes\" width=\"424,6267\" height=\"292,7603\" \/><\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000369\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000369?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000369\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"123b777de9\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In den Office-Anwendungen Word, Excel oder Access passen wir vorhandene Kontextmen&uuml;s per VBA &uuml;ber das Objektmodell von Office an. Auch das Hinzuf&uuml;gen und die Anzeige benutzerdefinierter Kontextmen&uuml;s erledigen wir auf diese Weise. Unter Outlook sieht die Situation anders aus: Hier wurde die Definition von Kontextmen&uuml;s bereits in die Ribbondefinition integriert. Wir haben dort einen eigenen Abschnitt namens &#8220;contextMenu&#8221; mit dem wir vorhandene Kontextmen&uuml;s anpassen und erweitern k&ouml;nnen. In diesem Artikel schauen wir uns an, wie wir solche Anpassungen vornehmen und welche M&ouml;glichkeiten sich daraus ergeben.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662023,66032023,44000020,44000004,44000026],"tags":[],"yst_prominent_words":[],"class_list":["post-55000369","post","type-post","status-publish","format-standard","hentry","category-662023","category-66032023","category-Entity_Framework_Core","category-Loesungen","category-Outlook_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000369","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000369"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000369\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000369"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000369"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000369"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000369"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}