Exempelkod för Windows-knapp

Det här avsnittet innehåller ett komplett kodexempel som visar hur du växlar ned en Windows-knapp och sedan uppåt. Exemplet innehåller nödvändiga huvudfiler och biblioteksfunktioner för att säkerställa att de fungerar fullt ut.

Förutsättningar

Innan du använder den här koden kontrollerar du att du har inkluderat följande huvudfiler och länkat de bibliotek som krävs:

#include <windows.h>  
#include <setupapi.h>  
#include <initguid.h>  
#include <devpkey.h>  
#include <stdio.h>  

Kodexempel

Följande kod växlar ned den identifierade Windows-knappen och sedan uppåt:

#include <windows.h>  
#include <setupapi.h>  
#include <initguid.h>  
#include <devpkey.h>  
#include <stdio.h>  
   
// Define the GUID for the GPIO buttons notify interface  
DEFINE_GUID(GUID_GPIOBUTTONS_NOTIFY_INTERFACE,   
0x4a1e55b2, 0xf16f, 0x11d2, 0xbc, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);  
   
// Enum for GPIO button types  
typedef enum {  
    GPIO_BUTTON_WINDOWS = 0x01  
} GPIOBUTTONS_BUTTON_TYPE;  
   
// Function to get the device path  
LPWSTR GetDevicePath(LPGUID InterfaceGuid);  
   
int __cdecl InjectButtonPress(__in int argc, __in_ecount(argc) char **argv) {  
    LPWSTR DevicePath;  
    HANDLE FileHandle;  
    BOOL b;  
    BYTE buffer;  
    HWND hwnd;  
    MSG msg;  
  
    // Get the device path for the GPIO buttons notify interface  
    DevicePath = GetDevicePath((LPGUID)&GUID_GPIOBUTTONS_NOTIFY_INTERFACE);  
    if (DevicePath == NULL) {  
        printf("Failed to get device path.\n");  
        return 1;  
    }  
  
    // Open the device  
    FileHandle = CreateFile(DevicePath,  
                            GENERIC_WRITE,  
                            0,  
                            NULL,  
                            OPEN_EXISTING,  
                            0,  
                            NULL);  
    if (FileHandle == INVALID_HANDLE_VALUE) {  
        printf("Failed to open device.\n");  
        return 1;  
    }  
  
    // Send button down  
    buffer = GPIO_BUTTON_WINDOWS;  
    b = WriteFile(FileHandle, &buffer, sizeof(buffer), NULL, NULL);  
    if (!b) {  
        printf("Failed to send button down.\n");  
        CloseHandle(FileHandle);  
        return 1;  
    }  
  
    // Send button up  
    buffer = GPIO_BUTTON_WINDOWS;  
    b = WriteFile(FileHandle, &buffer, sizeof(buffer), NULL, NULL);  
    if (!b) {  
        printf("Failed to send button up.\n");  
        CloseHandle(FileHandle);  
        return 1;  
    }  
  
    // Close the device handle  
    CloseHandle(FileHandle);  
    return 0;  
}  
   
// Implementation of GetDevicePath function  
LPWSTR GetDevicePath(LPGUID InterfaceGuid) {  
    // Implementation to retrieve the device path  
    // This is a placeholder and should be replaced with actual code  
    return L"\\\\.\\DevicePath";  
}  

Förklaring

  1. Rubrikfiler: De nödvändiga huvudfilerna inkluderas i början av koden.
  2. GUID-definition: GUID för GPIO-knapparnas notifieringsgränssnitt är definierat.
  3. Enum-definition: En enum för GPIO-knapptyper definieras.
  4. GetDevicePath-funktion: En platshållarfunktion för GetDevicePath tillhandahålls. Ersätt detta med den faktiska implementeringen.
  5. Huvudfunktion: Funktionen InjectButtonPress utför följande steg:
    • Hämtar enhetssökvägen.
    • Öppnar enheten.
    • Skickar kommandon för att trycka ned och släppa upp knappen.
    • Stänger handtaget till enheten.

Se till att du ersätter platshållarfunktionen GetDevicePath med den verkliga implementeringen för att få tag på sökvägen till din specifika enhet.