{"id":55001032,"date":"2016-04-01T00:00:00","date_gmt":"2020-05-22T19:02:19","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1032"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"WindowsAPI_per_VBA_nutzen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/WindowsAPI_per_VBA_nutzen\/","title":{"rendered":"Windows-API per VBA nutzen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/396e0f6710df418aba4557c4af289e6e\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Access stellt ausreichend Bordmittel zur Programmierung von Datenbankanwendungen zur Verf&uuml;gung. Dazu geh&ouml;ren die Benutzerschnittstellen zur Gestaltung der Datenbankobjekte wie Tabellen, Abfragen, Formulare und Berichte sowie die M&ouml;glichkeit, Abl&auml;ufe ereignisgesteuert per Makro oder VBA zu automatisieren. Manchmal reichen die vorhandenen Befehle aber nicht aus. In dem Fall greifen Sie auf die Prozeduren der Windows-API (Application Programming Interface) zu. Mit API-Prozeduren k&ouml;nnen Sie Ihre Anwendungen alles machen lassen, was Windows auch kann.<\/b><\/p>\n<p>Die Windows-API verf&uuml;gt &uuml;ber eine sehr gro&szlig;e Anzahl von Befehlen. Der vorliegende Beitrag kann Ihnen aber aus Platzgr&uuml;nden nur einen kleinen Einblick in die M&ouml;glichkeiten der API-Programmierung geben. Nach einer kurzen Einf&uuml;hrung, in der die wichtigsten Begriffe und die technischen Grundlagen erkl&auml;rt werden, folgt der Praxisteil mit einigen Beispielen. Die Beispiele sind so ausgew&auml;hlt, dass Sie sie gut in Ihre eigenen Anwendungen &uuml;bernehmen k&ouml;nnen.<\/p>\n<h2>VBA und API<\/h2>\n<p>Das Datenbanksystem <b>Microsoft Access <\/b>ist Windows-kompatibel. Daraus ergeben sich f&uuml;r den Entwickler gro&szlig;e Vorteile. Er kann mit Access Datenbanken erstellen, welche die Eigenschaften von Windows wie selbstverst&auml;ndlich ausnutzen. Dabei muss der Entwickler sich nicht damit abm&uuml;hen, das Aussehen von Formularen, Berichten und den darin enthaltenen Steuerelementen zu programmieren. Access stellt Werkzeuge zur Verf&uuml;gung, mit denen die Erstellung solcher Objekte zum Kinderspiel wird. Der Entwickler muss lediglich die verschiedenen Ereignisse per VBA programmieren, mit denen die Anwendung auf die unterschiedlichen Benutzereingaben reagiert.<\/p>\n<p>Streng genommen handelt es sich bei den Befehlen nicht nur um VBA-Befehle. VBA selbst enth&auml;lt nur die Befehle, die von den Microsoft-Anwendungen wie zum Beispiel Word, Excel und eben Access genutzt werden k&ouml;nnen. Um eine Datenbank zu programmieren, ben&ouml;tigen Sie dar&uuml;ber hinaus mindestens noch die Bibliotheken <b>Microsoft Access x.0 Object Library <\/b>und eine Datenzugriffsbibliothek wie in den neueren Versionen von Access die Bibliothek <b>Microsoft Office x.0 Access Database Engine Object Library<\/b>. Die beiden Bibliotheken enthalten die Befehle zur Steuerung der Datenbankobjekte von Access und zum Zugriff auf die in der Datenbank gespeicherten Daten.<\/p>\n<p>Windows selbst kennt &uuml;ber die Befehle der drei genannten Bibliotheken hinaus noch viel mehr Befehle. Diese sogenannten API-Befehle k&ouml;nnen Sie auch von Access aus aufrufen. In den folgenden Abschnitten erfahren Sie, wie Sie unterschiedliche Befehle der Windows-API aufrufen k&ouml;nnen und welche Vorraussetzungen dazu erf&uuml;llt sein m&uuml;ssen.<\/p>\n<h2>Die Prozedurbibliotheken von Windows<\/h2>\n<p>Die wesentlichen zum Betrieb von Windows notwendigen Prozeduren sind auf einige wenige Bibliotheken verteilt. Die folgenden drei sind die wichtigsten: <b>Kernel32.dll<\/b>, <b>User32.dll <\/b>und <b>GDI32.dll<\/b>.<\/p>\n<p>Die Bibliothek <b>Kernel32.dll <\/b>macht den eigentlichen Kern von Windows aus. Zu den Aufgaben der Prozeduren dieser Bibliothek geh&ouml;ren die Auswertung von Tastatureingaben, die Ausgabe auf dem Bildschirm, die Verwaltung der laufenden Anwendungen, die Verwaltung des Dateisystems und andere, die aber f&uuml;r den Einsatz im Zusammenhang mit Access eine untergeordnete Bedeutung haben.<\/p>\n<p>Die Prozeduren der Dynamic Link Library <b>User32 <\/b>dienen haupts&auml;chlich der Bereitstellung der Benutzerschnittstelle, das hei&szlig;t der Fenster, des Mauszeigers, des Ribbons und der Men&uuml;s und so weiter. Das &ouml;ffnen, Schlie&szlig;en und Verschieben der Fenster geh&ouml;rt zu den Aufgaben der <b>User32.dll<\/b>.<\/p>\n<p>Das Graphics Device Interface (<b>GDI32.dll<\/b>) dient der Ausgabe von grafischen Elementen wie Grafiken, Text, Farben et cetera. Es dient praktisch als Schnittstelle zwischen dem Benutzer und dem Ausgabeger&auml;t. Als Ausgabeger&auml;te kommen dabei alle m&ouml;glichen Ger&auml;te infrage &#8211; sowohl unterschiedliche Monitore als auch Drucker und andere Ausgabeger&auml;te. Windows stellt f&uuml;r alle m&ouml;glichen Formate einen Treiber zur Verf&uuml;gung. <\/p>\n<p>Neben den genannten Bibliotheken gibt es noch einige weitere, wie etwa die <b>COMDLG32.dll<\/b>, die unter anderem die Dialoge zum &ouml;ffnen und Speichern von Dateien und zur Auswahl von Farben und von Zeichens&auml;tzen zur Verf&uuml;gung stellt.<\/p>\n<p>Wie hier zu erkennen ist, sind die zum Betrieb von Windows notwendigen Prozeduren nach Aufgaben geordnet auf unterschiedliche Bibliotheken aufgeteilt. Durch diese modulare Bauweise ist Windows leicht erweiterbar. Dementsprechend sind im Laufe der Zeit noch einige weitere Bibliotheken hinzugekommen. Sie stellen zum Beispiel neue Steuerelemente zur Verf&uuml;gung (<b>COMCTL32.dll<\/b>), erm&ouml;glichen den Austausch von E-Mail (<b>MAPI32.dll<\/b>) oder dienen zur Verwaltung von Netzwerken (<b>NETAPI32.dll<\/b>).<\/p>\n<h2>Wo finde ich die API-Prozedur f&uuml;r meine Zwecke<\/h2>\n<p>Ohne entsprechende Dokumentation der Prozeduren der Windows-API ist es sehr schwer, bestimmte Aufgaben mit Hilfe der API zu l&ouml;sen. Sie m&uuml;ssen also zun&auml;chst eine geeignete API-Prozedur f&uuml;r Ihre Aufgabe finden. Das zweite Problem ist, dass die meisten Prozeduren der API-Bibliotheken in C programmiert sind. Dementsprechend sind sie auch f&uuml;r den Aufruf von C-Programmen ausgelegt. Vor allem wegen der unterschiedlichen Variablentypen in Visual Basic und in C kann der Aufruf einer solchen Funktion manchmal Probleme bereiten. Es gibt aber gen&uuml;gend Quellen, die den Aufruf von API-Funktionen aus Visual Basic heraus beschreiben. Neben diversen Fachzeitschriften, in denen immer wieder Beitr&auml;ge zum Thema API auftauchen, soll an dieser Stelle auf ein Buch hingewiesen werden, das zwar leider englischsprachig ist, aber von vielen als API-Bibel bezeichnet wird: Dan Appleman&#8220;s &#8222;Visual Basic Programmer&#8220;s Guide to the Win32 API&#8220;. Wenn Sie also Gefallen an der Integration von API-Funktionen in Ihre Anwendungen finden, erfahren Sie dort mehr.<\/p>\n<h2>Deklaration von API-Funktionen<\/h2>\n<p>Sie k&ouml;nnen API-Funktionen nicht wie gew&ouml;hnliche VBA-Prozeduren aufrufen. Sie m&uuml;ssen die gew&uuml;nschte Prozedur zun&auml;chst deklarieren. Strenggenommen werden die VBA-Befehle und die Befehle zur Verwaltung der Datenbankobjekte auch deklariert &#8211; allerdings funktioniert das auf eine andere Weise und wird normalerweise direkt beim &ouml;ffnen von Access erledigt. Die Deklaration dieser und anderer Bibliotheken nehmen Sie vor, indem Sie mit einem Verweis direkt die ganze Bibliothek verf&uuml;gbar machen. Um einen solchen Verweis zu setzen, &ouml;ffnen Sie ein beliebiges Modul in der Entwurfsansicht und w&auml;hlen den Men&uuml;befehl <b>Extras|Verweise<\/b>. Im Dialog <b>Verweise<\/b> (s. Bild 1) k&ouml;nnen Sie durch Markieren der Kontrollk&auml;stchen Verweise auf die einzelnen Bibliotheken setzen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1032_004.png\" alt=\"Die Funktionen einiger Bibliotheken k&ouml;nnen per Verweis referenziert werden.\" width=\"424,6255\" height=\"330,2643\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Die Funktionen einiger Bibliotheken k&ouml;nnen per Verweis referenziert werden.<\/span><\/b><\/p>\n<p>Die Deklaration von API-Prozeduren ist nicht ganz so einfach. Sie m&uuml;ssen jede API-Prozedur separat deklarieren. Bevor Sie mit dem ersten Beispiel beginnen, soll hier kurz die Syntax der Deklaration einer API-Prozedur erl&auml;utert werden.<\/p>\n<h2>Syntax der Deklaration einer API-Prozedur<\/h2>\n<p>Allgemein sieht die Syntax folgenderma&szlig;en aus:<\/p>\n<pre>[Public|Private] Declare Function|Sub name Lib \"libname\" _ [Alias \"aliasname\"]([argumentlist])] [As type] <\/pre>\n<p>Mit dem ersten Parameter, <b>Public <\/b>oder <b>Private<\/b>, geben Sie an, ob die Funktion nur innerhalb des Moduls G&uuml;ltigkeit hat, oder ob sie anwendungsweit aufgerufen werden kann. Lassen Sie den ersten Parameter weg, hat die Funktion anwendungsweite G&uuml;ltigkeit.<\/p>\n<p>Die <b>Declare<\/b>-Anweisung weist darauf hin, dass eine externe Funktion deklariert wird.<\/p>\n<p>Als n&auml;chstes Schl&uuml;sselwort geben Sie wie bei der Programmierung einer VBA-Prozedur entweder das Schl&uuml;sselwort <b>Function <\/b>oder <b>Sub <\/b>an &#8211; je nachdem, ob die Prozedur einen oder mehrere Werte zur&uuml;ckgibt oder nicht. In der Regel bekommen Sie es aber mit Funktionen zu tun.<\/p>\n<p>Unter <b>Name <\/b>geben Sie den Namen der API-Prozedur an. Unter dem hier angegebenen Namen rufen Sie die Prozedur von Ihren eigenen Prozeduren aus auf. In der Regel ist das auch der Name, unter dem die Prozedur in der jeweiligen DLL abgelegt ist. Es gibt aber manche API-Prozeduren, deren Name nicht den VBA-Konventionen f&uuml;r Prozedurnamen entspricht. In dem Fall wird der eigentliche Name der API-Prozedur hinter dem Schl&uuml;sselwort Alias als <b>aliasname<\/b> angegeben. Zum Aufruf der API-Prozedur benutzen Sie aber die unter <b>Name <\/b>angegebene Bezeichnung.<\/p>\n<p>Nach dem Schl&uuml;sselwort <b>Lib <\/b>folgt der Name der Bibliothek, in der die Prozedur abgelegt ist. Es gibt drei unterschiedliche Arten, die Bibliothek anzugeben. Bei den drei Bibliotheken <b>Kernel32<\/b>, <b>User32 <\/b>und <b>GDI32 <\/b>reicht die Angabe des Namens ohne Dateinamenendung. Bei allen anderen Bibliotheken geben Sie die Dateinamenendung an. Manchmal m&uuml;ssen Sie zus&auml;tzlich den Pfad der Bibliothek angeben. Das ist der Fall, wenn sich die Bibliothek nicht in den folgenden Verzeichnissen befindet:<\/p>\n<ul>\n<li>Anwendungsverzeichnis<\/li>\n<li>aktuelles Verzeichnis<\/li>\n<li>Windows-Systemverzeichnis<\/li>\n<li>Windows-Verzeichnis<\/li>\n<li>Verzeichnisse, die in der Umgebungsvariablen <b>Path <\/b>angegeben sind<\/li>\n<\/ul>\n<p>F&uuml;r den Parameter <b>ArgumentList <\/b>geben Sie die Argumente an, die beim Aufruf der Prozedur &uuml;bergeben werden. Die &uuml;bergabe von Argumenten kann auf zwei Arten erfolgen. Welche der beiden Arten zu w&auml;hlen ist, gibt die jeweilige Prozedur vor. Entweder Sie &uuml;bergeben den Parameter als Wert und setzen dem Parameter das Schl&uuml;sselwort <b>ByVal <\/b>voran, oder Sie &uuml;bergeben die Speicheradresse des Parameters. Geben Sie dann entweder das Schl&uuml;sselwort <b>ByRef <\/b>oder gar kein Schl&uuml;sselwort an.<\/p>\n<p>&uuml;bergeben Sie den Parameter als Wert, erh&auml;lt die DLL nur eine Kopie des Parameters. Nachdem der Parameter bearbeitet wurde, wird die Kopie &uuml;ber das Original geschrieben. Wenn Sie hingegen eine Referenz &uuml;bergeben, also einen Verweis auf die Adresse des Parameters, kann die DLL direkt auf den Parameter zugreifen.<\/p>\n<p>Wann man welche Art der Parameter&uuml;bergabe w&auml;hlt und warum, wird erst deutlich, wenn man sich eingehender mit den unterschiedlichen Variablenarten in Visual Basic und C besch&auml;ftigt. In den sp&auml;ter vorgestellten Beispielen wird die Art der Parameter&uuml;bergabe jeweils angegeben. Zu der Parameter&uuml;bergabe in weiteren API-Prozeduren erfahren Sie mehr in der einschl&auml;gigen Fachliteratur.<\/p>\n<p>Hinter dem Schl&uuml;sselwort <b>As <\/b>geben Sie schlie&szlig;lich den Datentyp an. Mehr &uuml;ber die in API-Aufrufen verwendeten Datentypen erfahren Sie im n&auml;chsten Abschnitt.<\/p>\n<h2>Datentypen beim Aufruf von API-Prozeduren<\/h2>\n<p>Die zu verwendenden Datentypen werden &auml;hnlich wie die Art der Parameter&uuml;bergabe durch die aufzurufende Prozedur festgelegt. &uuml;blicherweise finden hier die in VB &uuml;blichen Datentypen Verwendung.<\/p>\n<p>Eine Ausnahme ist der Datentyp <b>Any<\/b>. Er wird nur in Zusammenhang mit dem Aufruf von API-Prozeduren eingesetzt. Ein Parameter des Datentyps <b>Any <\/b>kann unterschiedliche Datentypen annehmen, zum Beispiel <b>String <\/b>und <b>Long<\/b>. Wenn Ihnen ein solcher Datentyp begegnet, ist meist ein weiterer Parameter nicht weit, in dem der f&uuml;r den Parameter g&uuml;ltige Datentyp &uuml;bergeben wird.<\/p>\n<p>Eine weitere Ausnahme sind benutzerdefinierte Datentypen. Parameter eines benutzerdefinierten Datentyps bestehen meist aus mehreren Parametern, die sich auf ein einziges Objekt beziehen. Solche Datentypen m&uuml;ssen im Deklarationsteil eines Moduls deklariert werden. Anschlie&szlig;end m&uuml;ssen Sie den Namen des benutzerdefinierten Datentyps der gew&uuml;nschten Variablen zuweisen.<\/p>\n<h2>Wo deklariere ich API-Prozeduren<\/h2>\n<p>Es gibt zwei sinnvolle M&ouml;glichkeiten, API-Prozeduren zu deklarieren. Entweder Sie nehmen die Deklaration aller API-Funktionen und benutzerdefinierten Datentypen in einem eigens daf&uuml;r angelegten Modul vor. Auf diese Weise ist es ab einer gewissen Menge Deklarationen leichter, die &uuml;bersicht zu behalten. Wenn Sie hingegen wissen, dass Sie eine bestimmte API-Funktion nur in einer Prozedur aufrufen, sollten Sie die Deklaration und die aufrufende Prozedur in einem Modul unterbringen. So k&ouml;nnen Sie die Komponenten im Paket kopieren und in anderen Anwendungen verwenden.<\/p>\n<h2>Praxisbeispiele zur Benutzung der Windows-API mit Access<\/h2>\n<p>Leider sind die Kenntnisse einiger theoretischer Grundlagen bei der Benutzung der Windows-API unumg&auml;nglich. Da die API weit &uuml;ber 1.000 Prozeduren kennt, k&ouml;nnen Sie sich vorstellen, dass nicht alles Wichtige in den vorangegangenen Abschnitten untergebracht werden konnte. In den folgenden Beispielen zum praktischen Umgang mit den Prozeduren der Windows-API werden sich deshalb immer wieder kleine Abschnitte mit den theoretischen Hintergr&uuml;nden besch&auml;ftigen.<\/p>\n<p>Da der vorliegende Beitrag nicht alle API-Prozeduren vorstellen kann, finden Sie hier nur eine Auswahl von Prozeduren. <\/p>\n<h2>Name des Computers und des Benutzers ermitteln<\/h2>\n<p>Die API-Funktionen zur Bestimmung des Computernamens und des aktuellen Benutzers des Computers sollen als erstes Beispiel dienen. Die entsprechenden API-Prozeduren hei&szlig;en <b>GetComputerName <\/b>und <b>GetUserName<\/b>.<\/p>\n<p><!--30percent--><\/p>\n<p>Sie m&uuml;ssen die Prozeduren vor dem Aufruf in geeigneter Weise deklarieren. Damit Sie die im Rahmen des vorliegenden Beitrags erstellten Prozeduren mit ihren API-Aufrufen gut in Ihre eigenen Datenbankl&ouml;sungen integrieren k&ouml;nnen, legen Sie jeweils ein neues Modul f&uuml;r jedes Beispiel an.<\/p>\n<p>Wenn Sie ein neues Standardmodul angelegt haben, speichern Sie es unter dem Namen <b>mdlSystemInformation<\/b>. Anschlie&szlig;end deklarieren Sie die erste der beiden Funktionen wie folgt:<\/p>\n<pre>Declare Function GetComputerName Lib \"kernel32\" _\r\n     Alias \"GetComputerNameA\" (ByVal lpBuffer<span style=\"color:blue;\"> As <\/span>_\r\n     String, nSize<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Der Deklaration k&ouml;nnen Sie entnehmen, dass die Funktion <b>GetComputerName <\/b>zur  Dynamic Link Library <b>Kernel32 <\/b>geh&ouml;rt und dort unter dem Namen <b>GetComputerNameA <\/b>bekannt ist. Die Funktion hat zwei Parameter, die Zeichenkette <b>lpBuffer <\/b>wird als Wert &uuml;bergeben, w&auml;hrend die L&auml;nge der Zeichenkette <b>nSize <\/b>als Referenz &uuml;bergeben wird. Der R&uuml;ckgabewert hat den Datentyp <b>Long<\/b>.<\/p>\n<p>Der R&uuml;ckgabewert enth&auml;lt bei vielen Funktionen nicht die Informationen, die Sie eigentlich abrufen m&ouml;chten. In der vorliegenden Funktion <b>GetComputerName <\/b>wird etwa der Zahlenwert <b>1 <\/b>zur&uuml;ckgegeben, wenn es einen Computernamen gibt, und der Wert <b>0<\/b>, wenn kein Computername gefunden wurde. <\/p>\n<p>Die gew&uuml;nschte Information packt die API-Funktion in die Parameter. Sie weist dem Parameter <b>lpBuffer <\/b>den Namen des Computers als String und dem Parameter <b>nSize <\/b>die L&auml;nge der &uuml;bergebenen Zeichenkette als <b>Long <\/b>zu.<\/p>\n<p>Es ist sehr wichtig, dass Sie <b>String<\/b>-Parametern vor der &uuml;bergabe an eine DLL eine Zeichenkette zuweisen, die mehr Zeichen enth&auml;lt als der erwartete Wert haben kann. Ist der zur&uuml;ckgegebene String l&auml;nger als der &uuml;bergebene String, l&ouml;st das einen Fehler aus.<\/p>\n<p>In der Funktion aus Listing 1 k&ouml;nnen Sie die API-Funktion nun endlich einsetzen.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Computername()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strComputerName<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngAnzahlZeichen<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngTemp<span style=\"color:blue;\"> As Long<\/span>\r\n     lngAnzahlZeichen = 256\r\n     strComputerName = Space$(lngAnzahlZeichen)\r\n     lngTemp = GetComputerName(strComputerName, lngAnzahlZeichen)\r\n     Computername = Trim$(strComputerName)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Funktion zum Ermitteln des Computernamens per API<\/span><\/b><\/p>\n<p>Zun&auml;chst deklarieren Sie dort die ben&ouml;tigten Variablen f&uuml;r den zu &uuml;bergebenden Text sowie die L&auml;nge des Textes.<\/p>\n<p>Der Variablen <b>lngTemp <\/b>weisen Sie den R&uuml;ckgabewert der Funktion zu. Dem Parameter <b>strComputerName <\/b>weisen Sie mit der <b>Space$<\/b>-Funktion einen String mit 256 Leerzeichen zu. Nach dem Aufruf der Funktion benutzen Sie die Funktion <b>Trim$<\/b>, um die &uuml;berfl&uuml;ssigen Leerzeichen des zur&uuml;ckgegebenen Wertes zu entfernen.<\/p>\n<p>Testen Sie die Funktion mit Hilfe des Testfenster (zu &ouml;ffnen mit <b>Strg + G<\/b>). Lassen Sie sich einfach den Computernamen in einem Meldungsfenster ausgeben:<\/p>\n<pre>  Computername\r\nWIN7OFF13IND <\/pre>\n<h2>Benutzername per API ermitteln<\/h2>\n<p>Die Ausgabe des Benutzernamens k&ouml;nnen Sie in &auml;hnlicher Weise vornehmen. Die Deklaration des entsprechenden API-Aufrufs lautet:<\/p>\n<pre>Declare Function GetUserName Lib \"advapi32.dll\" _\r\n     Alias \"GetUserNameA\" (ByVal lpBuffer<span style=\"color:blue;\"> As String<\/span>, _\r\n     nSize<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Die Vorgehensweise zum Ermitteln des Namens des aktuell eingeloggten Benutzers ist prinzipiell mit dem Ermitteln des Computernamens identisch. Die Funktion zum Aufruf der API-Prozedur <b>GetUserNameA <\/b>ist allerdings etwas anders gestaltet, um Sie auf eine Besonderheit beim Aufruf von API-Funktionen aufmerksam zu machen (s. Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Benutzername()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBenutzername<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngAnzahlZeichen<span style=\"color:blue;\"> As Long<\/span>\r\n     lngAnzahlZeichen = 256\r\n     strBenutzername = Space$(lngAnzahlZeichen)\r\n     GetUserName strBenutzername, lngAnzahlZeichen\r\n     Benutzername = Trim$(strBenutzername)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Funktion zum Ermitteln des Benutzernamens per API<\/span><\/b><\/p>\n<p>Wie Sie erkennen k&ouml;nnen, gibt es in der Funktion keine Variable namens <b>lngTemp<\/b>, um den R&uuml;ckgabewert der API-Funktion zu speichern. Die Funktion wird auch gar nicht in Form einer Wertzuweisung aufgerufen, wie es &uuml;blicherweise bei Funktionen der Fall ist, sondern wie eine Prozedur. Da es in den meisten F&auml;llen nicht auf den R&uuml;ckgabewert ankommt, sondern auf die ge&auml;nderten Parameter, kann man sich hier die Deklaration einer Variablen und damit Zeit und Speicherplatz sparen.<\/p>\n<p>Die beiden Funktionen k&ouml;nnen Sie nun zum Beispiel benutzen, um den Anwender beim Start der Datenbank mit seinem Namen zu begr&uuml;&szlig;en.<\/p>\n<h2>Zugriff auf Fenster und andere Objekte per Handle<\/h2>\n<p>Den Begriff <b>Handle <\/b>werden Sie sicher bereits einmal geh&ouml;rt haben. Ein Handle ist eine M&ouml;glichkeit, Objekte unter Windows eindeutig zu kennzeichnen. Dadurch, dass Windows mitunter Objekte aus dem Arbeitsspeicher tempor&auml;r auf die Festplatte oder in andere Speicherbereiche verbannt, sind die Objekte teilweise nicht mehr unter der angegebenen Speicheradresse anzutreffen.<\/p>\n<p>Dies erscheint zun&auml;chst wie ein Windows-internes Problem &#8211; da Sie aber per API Windows direkt steuern, erweisen sich Handles f&uuml;r den Entwickler als sehr n&uuml;tzlich. Der Inhalt eines Handles, also der Verweis auf ein Objekt, wird immer im Arbeitsspeicher gehalten &#8211; auch wenn das Objekt selbst zwischenzeitlich auf die Festplatte verbannt wurde.<\/p>\n<p>Wenn Sie also per API auf ein Objekt zugreifen m&ouml;chten, ermitteln Sie zun&auml;chst dessen Handle. Zur Ermittlung eines Handles gibt es unterschiedliche M&ouml;glichkeiten, von denen einige sp&auml;ter vorgestellt werden. Wenn Sie das Handle einmal kennen, k&ouml;nnen Sie &uuml;ber das Handle auf das entsprechende Objekt zugreifen. <\/p>\n<p>Deutlicher wird dies an einem Beispiel. Mit der Funktion <b>GetWindowText <\/b>soll der Titel des aktuellen Access-Hauptfensters ermittelt werden. Die API-Prozedur hat die folgende Deklaration:<\/p>\n<pre>Declare Function GetWindowText Lib \"user32\" Alias _\r\n     \"GetWindowTextA\" (ByVal hWnd<span style=\"color:blue;\"> As Long<\/span>, ByVal _\r\n     lpString<span style=\"color:blue;\"> As String<\/span>, ByVal cch<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Der erste Eintrag in der Parameterliste ist der Parameter <b>hWnd<\/b>. F&uuml;r ihn m&uuml;ssen Sie das Handle des Fensters &uuml;bergeben, dessen Fenstertext Sie ermitteln m&ouml;chten. Sie m&uuml;ssen also zun&auml;chst das Handle bestimmen. Wenn Sie die Funktion von Access aus aufrufen, ist das gew&uuml;nschte Fenster das aktuelle Fenster. Das Handle des aktuellen Fensters ermitteln Sie mit der wie folgt deklarierten API-Prozedur:<\/p>\n<pre>Declare Function GetActiveWindow Lib \"user32\" ()<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Sie k&ouml;nnen nun beide API-Funktionen in einer Funktion verwenden (s. Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>FenstertitelErmitteln()\r\n     <span style=\"color:blue;\">Dim <\/span>hWnd<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFenstertitel<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngAnzahlZeichen<span style=\"color:blue;\"> As Integer<\/span>\r\n     lngAnzahlZeichen = 256\r\n     strFenstertitel = Space$(lngAnzahlZeichen)\r\n     hWnd = GetActiveWindow()\r\n     GetWindowText hWnd, strFenstertitel, 255\r\n     FenstertitelErmitteln = Left$(strFenstertitel, lngAnzahlZeichen)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Funktion zum Ermitteln des Fenstertitels des aktiven Fensters<\/span><\/b><\/p>\n<p>Die Funktion <b>FenstertitelErmitteln <\/b>legt wie gewohnt zun&auml;chst die an die API-Funktion zu &uuml;bergebenden Parameter fest. Dabei wird das Handle auf das aktuelle Fenster ebenfalls durch eine API-Funktion ermittelt und anschlie&szlig;end weiterverwendet. Im Direktbereich liefert der Funktionsaufruf das folgende Ergebnis:<\/p>\n<pre>  FenstertitelErmitteln\r\nMicrosoft Visual Basic for Applications - API [Aktiv] - [mdlSystemInformation (Code)]<\/pre>\n<p>Sie k&ouml;nnen Funktionsnamen der bisher erstellten Funktionen in einem Formular als Steuerelementinhalt verschiedener Textfelder angeben (s. Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1032_001.png\" alt=\"VBA-Funktionen im Formular nutzen (Entwurf)\" width=\"499,5594\" height=\"362,0118\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: VBA-Funktionen im Formular nutzen (Entwurf)<\/span><\/b><\/p>\n<p>Die Textfelder geben dann die Ergebnisse der Funktion aus (s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1032_002.png\" alt=\"VBA-Funktionen im Formular nutzen (Formularansicht)\" width=\"649,4275\" height=\"184,4052\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: VBA-Funktionen im Formular nutzen (Formularansicht)<\/span><\/b><\/p>\n<p>Wenn Sie sp&auml;ter weitere API-Funktionen verwenden, werden Sie des &ouml;fteren mit Handles arbeiten m&uuml;ssen. Parameter, die ein Handle als Wert erwarten, beginnen immer mit einem kleinen <b>h <\/b>und enden mit dem Typ des Handles. In der folgenden Auflistung finden Sie einige Beispiele von Handles (Parametername in Klammern):<\/p>\n<ul>\n<li><b>Bitmap <\/b>(<b>hBitmap<\/b>): Verweist auf den Speicherort eines Bitmap<\/li>\n<li><b>File <\/b>(<b>hFile<\/b>): Verweis auf eine Datei<\/li>\n<li><b>Men&uuml; <\/b>(<b>hMenu<\/b>): Verweis auf eine Men&uuml;leiste oder ein Kontextmen&uuml;<\/li>\n<li><b>Fenster <\/b>(<b>hWindow<\/b>, <b>hDlg<\/b>, <b>hCtl<\/b>): Verweis auf Fenster, wozu auch Dialoge (<b>hDlg<\/b>) und Steuer-elemente (<b>hCtl<\/b>) geh&ouml;ren<\/li>\n<li><b>Instanz <\/b>(<b>hInstance<\/b>): Verweis auf eine von mehreren Instanzen der gleichen Anwendung<\/li>\n<\/ul>\n<p>Sie k&ouml;nnen das Handle des Access-Hauptfensters auch auslesen, wenn es nicht das aktive Fenster ist. Dabei handelt es sich allerdings nicht um eine API-Prozedur, sondern um eine Access-interne Funktion. Die Funktion lautet:<\/p>\n<pre>Application.hWndAccessApp<\/pre>\n<p>Wenn Sie f&uuml;r eine eigene Datenbankanwendung einen eigenen Fenstertitel angeben m&ouml;chten, k&ouml;nnen Sie das auch mit einer API-Funktion tun:<\/p>\n<pre>Declare Function SetWindowText Lib \"user32\" Alias _\r\n     \"SetWindowTextA\" (ByVal hWnd<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpString<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Zur Anzeige eines alternativen Fenstertitels benutzen Sie den folgenden Befehl (in neuen Access-Versionen erscheint dieser Titel jedoch nur in der Taskleiste):<\/p>\n<pre>SetWindowText Application.hWndAccessApp,\"Neuer Titel\"<\/pre>\n<p>Im vorliegenden Fall geben Sie die Parameter direkt an. Das ist eine gute M&ouml;glichkeit, eine API-Funktion im Testfenster auszuprobieren. Achtung: Wenn Sie Zeichenfolgen an API-Funktionen &uuml;bergeben, bei denen Sie die L&auml;nge der Zeichenfolge nicht angeben k&ouml;nnen, f&uuml;gen Sie der Zeichenfolge immer den Wert <b>&#038; vbNullChar <\/b>an. Nur so kann die API-Funktion erkennen, dass die Zeichenkette zu Ende ist.<\/p>\n<h2>Zustand eines Formulars ermitteln<\/h2>\n<p>Bei manchen Anwendungen soll aus optischen Gr&uuml;nden das aktuelle Formular das ganze Access-Hauptfenster ausf&uuml;llen. Access bietet zwar Befehle, mit denen das aktuelle Formular maximiert, minimiert oder wiederhergestellt werden kann. Sie k&ouml;nnen aber nicht feststellen, welchen Zustand das Formular momentan hat. In den folgenden Abschnitten schauen wir uns an, wie Sie dies erledigen k&ouml;nnen.<\/p>\n<h2>Handle eines Formulars ermitteln<\/h2>\n<p>Das Handle eines Formulars k&ouml;nnen Sie &uuml;ber die Formulareigenschaft <b>hWnd <\/b>ermitteln. Um etwa das Handle eines Formulars mit dem Namen <b>frmAPI <\/b>herauszufinden, benutzen Sie die folgende Anweisung (hier zur Ausgabe im Direktbereich):<\/p>\n<pre>  Forms!frmAPI.hWnd\r\n  593800 <\/pre>\n<h2>Status eines Formulars ermitteln<\/h2>\n<p>Wenn Sie das Handle des Formulars kennen, k&ouml;nnen Sie leicht den Status des Formulars herausfinden.<\/p>\n<p>Deklarieren Sie dazu die beiden folgenden API-Prozeduren:<\/p>\n<pre>Declare Function IsIconic Lib \"user32\" _\r\n     (ByVal hWnd<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\nDeclare Function IsZoomed Lib \"user32\" _\r\n     (ByVal hWnd<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Definieren Sie au&szlig;erdem die folgenden Konstanten im Deklarationsteil des Moduls:<\/p>\n<pre>Global Const NORMAL = 0\r\nGlobal Const MAXIMIZED = 1\r\nGlobal Const MINIMIZED = 2<\/pre>\n<p>Die Funktion <b>Fensterzustand <\/b>schlie&szlig;lich ermittelt mit Hilfe der beiden Funktionen <b>IsIconic <\/b>und <b>IsZoomed<\/b>, ob das Fenster minimiert oder maximiert ist. Falls keiner der beiden F&auml;lle eintritt, bleibt nur noch der &#8222;normale&#8220; Zustand des Fensters:<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>Fensterzustand(ByVal hWnd<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">If <\/span>IsIconic(hWnd)<span style=\"color:blue;\"> Then<\/span>\r\n         Fensterzustand = MINIMIZED\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>IsZoomed(hWnd)<span style=\"color:blue;\"> Then<\/span>\r\n         Fensterzustand = MAXIMIZED\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Fensterzustand = NORMAL\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Falls der Anwender ein bestimmtes Formular minimiert hat, das zu einem bestimmten Zeitpunkt sichtbar sein soll, k&ouml;nnen Sie das &uuml;berpr&uuml;fen und das Fenster gegebenenfalls in den gew&uuml;nschten Zustand bringen. Den Zustand eines Formulars ermitteln Sie etwa mit folgender Anweisung:<\/p>\n<pre>  Fensterzustand(forms!frmAPi.hWnd)\r\n  0<\/pre>\n<p>Die Ergebniswerte entsprechen dabei den Werten der soeben deklarierten Konstanten: <b>0 <\/b>f&uuml;r den normalen Zustand, <b>1 <\/b>f&uuml;r ein maximiertes und <b>2 <\/b>f&uuml;r ein minimiertes Formular.<\/p>\n<h2>Status des Access-Hauptfensters ermitteln<\/h2>\n<p>Mit der gleichen Funktion k&ouml;nnen Sie nat&uuml;rlich auch den Status des Access-Hauptfensters ermitteln. Sie m&uuml;ssen der Funktion lediglich das Handle des Access-Fensters &uuml;bergeben, also etwa folgenderma&szlig;en:<\/p>\n<pre>  Fensterzustand(Application.hWndAccessApp)<\/pre>\n<h2>Bildschirmaufl&ouml;sung ermitteln<\/h2>\n<p>Dazu ben&ouml;tigen Sie insgesamt drei Funktionen. Zun&auml;chst legen Sie mit der Funktion <b>CreateIC <\/b>das Ger&auml;t fest, &uuml;ber das Sie Informationen erhalten m&ouml;chten &#8211; in diesem Fall der Monitor. Es handelt sich dabei um die schnellste M&ouml;glichkeit, Informationen &uuml;ber ein bestimmtes Ger&auml;t zu erhalten. Die Deklaration der Funktion lautet:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>Declare Function CreateIC Lib \"gdi32\" Alias _\r\n     \"CreateICA\" (ByVal lpDriverName<span style=\"color:blue;\"> As String<\/span>, ByVal _\r\n     lpDeviceName<span style=\"color:blue;\"> As <\/span>Any, ByVal lpOutput<span style=\"color:blue;\"> As <\/span>Any, ByVal _\r\n     lpInitData<span style=\"color:blue;\"> As <\/span>Any)<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Nach der Abfrage der gew&uuml;nschten Informationen m&uuml;ssen Sie die Verbindung zu den Informationen wieder l&ouml;schen. Das geschieht mit der Funktion <b>DeleteIC <\/b>mit folgender Deklaration:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>Declare Function DeleteDC Lib \"gdi32\" _\r\n     (ByVal hdc<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Nat&uuml;rlich m&uuml;ssen Sie auch noch die gesuchten Informationen abrufen. Dazu dient die Funktion <b>GetDeviceCaps<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>Declare Function GetDeviceCaps Lib \"gdi32\" _\r\n     (ByVal hdc<span style=\"color:blue;\"> As Long<\/span>, ByVal nIndex<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Schlie&szlig;lich ben&ouml;tigen Sie noch eine benutzerdefinierte Funktion, die auf die genannten API-Funktionen zur&uuml;ckgreift, um die Bildschirmaufl&ouml;sung zu ermitteln.<\/p>\n<p>In der Funktion aus Listing 4 legen Sie zun&auml;chst eine Variable f&uuml;r das Handle fest, das auf den Ger&auml;tekontext des Bildschirms verweist. Anschlie&szlig;end deklarieren Sie einige Konstanten, die von der API-Funktion <b>CreateIC <\/b>zum Setzen des Handles auf den Ger&auml;tekontext des Monitors ben&ouml;tigt werden.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Bildschirmaufloesung(ByVal Eigenschaft<span style=\"color:blue;\"> As Integer<\/span>)<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>hDC<span style=\"color:blue;\"> As Long<\/span>\r\n     Const DRIVER_NAME = \"DISPLAY\"\r\n     Const DEVICE_NAME = 0&\r\n     Const OUTPUT_DEVICE = 0&\r\n     Const lpDevMode = 0&\r\n     hDC = CreateIC(DRIVER_NAME, DEVICE_NAME, OUTPUT_DEVICE, lpDevMode)\r\n     <span style=\"color:blue;\">If <\/span>hDC<span style=\"color:blue;\"> Then<\/span>\r\n         Bildschirmaufloesung = GetDeviceCaps(hDC, Eigenschaft)\r\n         DeleteDC hDC\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Funktion zum Ermitteln der Bildschirmaufl&ouml;sung<\/span><\/b><\/p>\n<p>Neben dem Monitor k&ouml;nnen Sie so auch auf die Informationen des Ger&auml;tekontext von Druckern zugreifen. Da an den meisten Rechnern nur ein Monitor angeschlossen ist, reicht die Angabe des Wertes <b>Display<\/b> f&uuml;r die Konstante <b>DRIVER_NAME<\/b>. Wenn Sie Informationen &uuml;ber einen Drucker erhalten m&ouml;chten, m&uuml;ssen Sie weitere Angaben wie zum Beispiel zum Druckernamen machen. Geben Sie dazu den Druckernamen an, der im <b>Drucken<\/b>-Dialog angezeigt wird.<\/p>\n<p>Nach dem Setzen des Verweises auf den Bildschirmkontext fragen Sie mit der API-Funktion <b>GetDeviceCap <\/b>die gew&uuml;nschte Eigenschaft ab. Da Sie nur eine Eigenschaft gleichzeitig abfragen k&ouml;nnen, rufen Sie die Funktion f&uuml;r die horizontale und vertikale Aufl&ouml;sung zwei Mal auf.<\/p>\n<p>Schlie&szlig;lich heben Sie den Verweis auf den Ger&auml;tekontext wieder auf.<\/p>\n<p>Damit Sie die Funktion anwenden k&ouml;nnen, deklarieren Sie noch zwei globale Konstanten:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Const HORZRES = 8\r\n<span style=\"color:blue;\">Public <\/span>Const VERTRES = 10<\/pre>\n<p>Wenn Sie die Funktion nun aufrufen, m&uuml;ssen Sie nicht mit den Zahlenwerten der gesuchten Eigenschaften arbeiten, sondern k&ouml;nnen die aussagekr&auml;ftigeren Konstantennamen verwenden. Die folgende Funktion gibt in einem Meldungsfenster die aktuelle Bildschirmaufl&ouml;sung aus (s. Bild 4):<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1032_003.png\" alt=\"Ausgabe der Bildschirmaufl&ouml;sung\" width=\"424,6255\" height=\"178,6675\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Ausgabe der Bildschirmaufl&ouml;sung<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">MsgBox<\/span> \"Die Bildschirmaufl&ouml;sung betr&auml;gt derzeit \" _\r\n     & Bildschirmaufloesung(HORZRES) & \" x \" _\r\n     & Bildschirmaufloesung(VERTRES) & \" Pixel.\"<\/pre>\n<h2>Gr&ouml;&szlig;e und Lage des Access-Hauptfensters <\/h2>\n<p>F&uuml;r manche Anwendungen ist es sinnvoll, das Access-Hauptfenster in einer bestimmten Gr&ouml;&szlig;e anzuzeigen. Das kann zum Beispiel den Grund haben, dass die Formulare f&uuml;r eine bestimmte Bildschirmgr&ouml;&szlig;e optimiert sind und in einem maximierten Hauptfenster auf einem 27&#8220;-Monitor etwas verloren wirken. Bei Formularen ist das kein Problem: Sie m&uuml;ssen einfach beim &ouml;ffnen des Formulars den Eigenschaften <b>Links<\/b>, <b>Rechts<\/b>, <b>H&ouml;he <\/b>und <b>Breite <\/b>die gew&uuml;nschten Eigenschaften zuweisen.<\/p>\n<p>Au&szlig;erdem k&ouml;nnen Sie mit der Eigenschaft <b>Zentriert <\/b>angeben, ob das Formular im Hauptfenster zentriert angezeigt werden soll. Selbst wenn der Benutzer die Koordinaten w&auml;hrend der Benutzung des Formulars ver&auml;ndert, k&ouml;nnten Sie beim Schlie&szlig;en die aktuellen Werte in einer Tabelle abspeichern und sie beim erneuten &ouml;ffnen des Formulars erneut abrufen.<\/p>\n<p>Beim Access-Hauptfenster k&ouml;nnen Sie die Aufgabe nur mit API-Funktionen erledigen. Mit der folgenden API-Funktion k&ouml;nnen Sie die Position und die Gr&ouml;&szlig;e des Anwendungsfensters sowie einige andere Eigenschaften &auml;ndern.<\/p>\n<p>Dazu geh&ouml;rt die Reihenfolge in der Liste der Fenster sowie einige Zeiger, mit denen Sie das Fenster zum Beispiel in den Hintergrund verschieben oder deaktivieren k&ouml;nnen. Hier geht es aber vordergr&uuml;ndig um die Position und die Gr&ouml;&szlig;e des Fensters.<\/p>\n<pre>Declare Function SetWindowPos Lib \"user32\" (ByVal hWnd _\r\n    <span style=\"color:blue;\"> As Long<\/span>, ByVal hWndInsertAfter<span style=\"color:blue;\"> As Long<\/span>, ByVal x<span style=\"color:blue;\"> As <\/span>_\r\n     Long, ByVal y<span style=\"color:blue;\"> As Long<\/span>, ByVal cx<span style=\"color:blue;\"> As Long<\/span>, ByVal cy _\r\n    <span style=\"color:blue;\"> As Long<\/span>, ByVal wFlags<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Die Parameter <b>x <\/b>und <b>y <\/b>legen die Position der oberen, linken Ecke des Fensters fest, die Parameter <b>cx <\/b>und <b>cy <\/b>die Breite und die H&ouml;he des Fensters. Wenn Sie etwa m&ouml;chten, dass das Hauptfenster bei jeder Bildschirmgr&ouml;&szlig;e zentriert mit 800 x 600 Pixeln angezeigt wird, m&uuml;ssen Sie das dem System nur per API-Funktion mitteilen.<\/p>\n<p>Au&szlig;erdem ben&ouml;tigen wir noch zwei Konstanten, die wir im Kopf des Standardmoduls deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Const HWND_TOP = 0\r\n<span style=\"color:blue;\">Public <\/span>Const SWP_NOZORDER = 4<\/pre>\n<p>Zun&auml;chst ermitteln Sie mit der Funktion <b>Bildschirmaufloesung() <\/b>die aktuelle Aufl&ouml;sung.<\/p>\n<p>Anschlie&szlig;end ist ein wenig Mathematik gefragt: Sie wissen zwar, dass Ihr Hauptformular mit 800 mal 600 Bildpunkten angezeigt werden soll. Sie m&uuml;ssen allerdings die Koordinaten noch so berechnen, dass das Hauptfenster auch zentriert angezeigt wird. Bild 5 zeigt die Lage der einzelnen Ma&szlig;e.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1032_005.png\" alt=\"Koordinaten von Bildschirm und Fenster\" width=\"650\" height=\"380,538\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Koordinaten von Bildschirm und Fenster<\/span><\/b><\/p>\n<p>Die x-Komponente wird berechnet aus:<\/p>\n<pre>x = (HORZRES - cx) \/ 2<\/pre>\n<p>Die Berechnung der y-Komponente erfolgt analog:<\/p>\n<pre>  y = (VERTRES - cy) \/ 2<\/pre>\n<p>In der Funktion aus Listing 5 sind die entsprechenden Berechnungen untergebracht. Als Parameter &uuml;bergeben Sie der Funktion die gew&uuml;nschte Aufl&ouml;sung.<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>HauptfensterZentrieren(cx<span style=\"color:blue;\"> As Integer<\/span>, cy<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>x<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>y<span style=\"color:blue;\"> As Integer<\/span>\r\n     x = (Bildschirmaufloesung(HORZRES) - cx) \/ 2\r\n     y = (Bildschirmaufloesung(VERTRES) - cy) \/ 2\r\n     SetWindowPos Application.hWndAccessApp, HWND_TOP, x, y, cx, cy, SWP_NOZORDER\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Zentrieren und Einstellen von Breite und H&ouml;he des Access-Fensters<\/span><\/b><\/p>\n<p>Das Hauptfenster wird dann in der gew&uuml;nschten Gr&ouml;&szlig;e genau in der Mitte des Bildschirms platziert.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag vermittelt die Grundlagen zur Nutzung der Funktionen der Windows-API. Dabei haben Sie erfahren, dass Sie eine API-Funktion zun&auml;chst deklarieren m&uuml;ssen, bevor Sie diese wie eine &uuml;bliche VBA-Funktion in ihrem Code ansprechen k&ouml;nnen. Es gibt einige Besonderheiten wie die Datentypen und die Tatsache, dass manche API-Funktionen das eigentlich gesuchte Ergebnis nicht per R&uuml;ckgabewert, sondern per Parameter zur&uuml;ckliefern, aber wenn man dies einmal erkannt hat, erscheint es sogar sehr praktisch auch im Hinblick auf die Programmierung eigener Funktionen.<\/p>\n<p>In weiteren Beitr&auml;gen werden wir den Einsatz der Windows-API in der Praxis vorstellen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>API.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{9F10E7B8-BAC7-487F-8881-68E715A522FB}\/aiu_1032.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Access stellt ausreichend Bordmittel zur Programmierung von Datenbankanwendungen zur Verf&uuml;gung. Dazu geh&ouml;ren die Benutzerschnittstellen zur Gestaltung der Datenbankobjekte wie Tabellen, Abfragen, Formulare und Berichte sowie die M&ouml;glichkeit, Abl&auml;ufe ereignisgesteuert per Makro oder VBA zu automatisieren. Manchmal reichen die vorhandenen Befehle aber nicht aus. In dem Fall greifen Sie auf die Prozeduren der Windows-API (Application Programming Interface) zu. Mit API-Prozeduren k&ouml;nnen Sie Ihre Anwendungen alles machen lassen, was Windows auch kann.<\/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":[66022016,662016,44000025],"tags":[],"class_list":["post-55001032","post","type-post","status-publish","format-standard","hentry","category-66022016","category-662016","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Windows-API per VBA nutzen - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/WindowsAPI_per_VBA_nutzen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Windows-API per VBA nutzen\" \/>\n<meta property=\"og:description\" content=\"Access stellt ausreichend Bordmittel zur Programmierung von Datenbankanwendungen zur Verf&uuml;gung. Dazu geh&ouml;ren die Benutzerschnittstellen zur Gestaltung der Datenbankobjekte wie Tabellen, Abfragen, Formulare und Berichte sowie die M&ouml;glichkeit, Abl&auml;ufe ereignisgesteuert per Makro oder VBA zu automatisieren. Manchmal reichen die vorhandenen Befehle aber nicht aus. In dem Fall greifen Sie auf die Prozeduren der Windows-API (Application Programming Interface) zu. Mit API-Prozeduren k&ouml;nnen Sie Ihre Anwendungen alles machen lassen, was Windows auch kann.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/WindowsAPI_per_VBA_nutzen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T19:02:19+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/396e0f6710df418aba4557c4af289e6e\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"25\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/WindowsAPI_per_VBA_nutzen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/WindowsAPI_per_VBA_nutzen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Windows-API per VBA nutzen\",\"datePublished\":\"2020-05-22T19:02:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/WindowsAPI_per_VBA_nutzen\\\/\"},\"wordCount\":4442,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/WindowsAPI_per_VBA_nutzen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/396e0f6710df418aba4557c4af289e6e\",\"articleSection\":[\"2\\\/2016\",\"2016\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/WindowsAPI_per_VBA_nutzen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/WindowsAPI_per_VBA_nutzen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/WindowsAPI_per_VBA_nutzen\\\/\",\"name\":\"Windows-API per VBA nutzen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/WindowsAPI_per_VBA_nutzen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/WindowsAPI_per_VBA_nutzen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/396e0f6710df418aba4557c4af289e6e\",\"datePublished\":\"2020-05-22T19:02:19+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/WindowsAPI_per_VBA_nutzen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/WindowsAPI_per_VBA_nutzen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/WindowsAPI_per_VBA_nutzen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/396e0f6710df418aba4557c4af289e6e\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/396e0f6710df418aba4557c4af289e6e\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/WindowsAPI_per_VBA_nutzen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Windows-API per VBA nutzen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Windows-API per VBA nutzen - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/WindowsAPI_per_VBA_nutzen\/","og_locale":"de_DE","og_type":"article","og_title":"Windows-API per VBA nutzen","og_description":"Access stellt ausreichend Bordmittel zur Programmierung von Datenbankanwendungen zur Verf&uuml;gung. Dazu geh&ouml;ren die Benutzerschnittstellen zur Gestaltung der Datenbankobjekte wie Tabellen, Abfragen, Formulare und Berichte sowie die M&ouml;glichkeit, Abl&auml;ufe ereignisgesteuert per Makro oder VBA zu automatisieren. Manchmal reichen die vorhandenen Befehle aber nicht aus. In dem Fall greifen Sie auf die Prozeduren der Windows-API (Application Programming Interface) zu. Mit API-Prozeduren k&ouml;nnen Sie Ihre Anwendungen alles machen lassen, was Windows auch kann.","og_url":"https:\/\/access-im-unternehmen.de\/WindowsAPI_per_VBA_nutzen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T19:02:19+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/396e0f6710df418aba4557c4af289e6e","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"25\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/WindowsAPI_per_VBA_nutzen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/WindowsAPI_per_VBA_nutzen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Windows-API per VBA nutzen","datePublished":"2020-05-22T19:02:19+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/WindowsAPI_per_VBA_nutzen\/"},"wordCount":4442,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/WindowsAPI_per_VBA_nutzen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/396e0f6710df418aba4557c4af289e6e","articleSection":["2\/2016","2016","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/WindowsAPI_per_VBA_nutzen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/WindowsAPI_per_VBA_nutzen\/","url":"https:\/\/access-im-unternehmen.de\/WindowsAPI_per_VBA_nutzen\/","name":"Windows-API per VBA nutzen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/WindowsAPI_per_VBA_nutzen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/WindowsAPI_per_VBA_nutzen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/396e0f6710df418aba4557c4af289e6e","datePublished":"2020-05-22T19:02:19+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/WindowsAPI_per_VBA_nutzen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/WindowsAPI_per_VBA_nutzen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/WindowsAPI_per_VBA_nutzen\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/396e0f6710df418aba4557c4af289e6e","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/396e0f6710df418aba4557c4af289e6e"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/WindowsAPI_per_VBA_nutzen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Windows-API per VBA nutzen"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001032","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001032"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001032\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001032"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001032"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001032"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}