Programm windwosweit ausführen



  • Hallo, ich habe folgendes Programm, es ist noch nicht groß und es macht nicht viel, lediglich den Cursor um 50px nach oben links zu versetzen:

    #include <windows.h>
    
    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    
    /*  Make the class name into a global variable  */
    char szClassName[ ] = "blabloiblubb";
    POINT mPos;
    BOOL rc;
    BOOL rd;
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR lpszArgument,
                         int nFunsterStil)
    {
        HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */
    
        /* The Window structure */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);
    
        /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default color as the background of the window */
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    
        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
            return 0;
    
        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "blablablabla",       /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               544,                 /* The programs width */
               375,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );
    
        /* Make the window visible on the screen */
        //ShowWindow (hwnd, nFunsterStil);
    
        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
    
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
    
    /*  This function is called by the Windows function DispatchMessage()  */
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
    
            case WM_LBUTTONUP:
                BOOL rc;
                rc = GetCursorPos(&mPos);
                Sleep(30);
                long x;
                long y;
                x=mPos.x-50;
                y=mPos.y-50;
                SetCursorPos(x,y);
                Sleep(10);
                mouse_event(MOUSEEVENTF_LEFTDOWN, 0,0,0,0);
    	        mouse_event(MOUSEEVENTF_LEFTUP, 0,0,0,0);
                break;
    
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    

    Mein Problem ist jedoch, dass es nur im Rahmen des Programms läuft. Sprich nur wenn das Programm im Vordergrund ist (Fenster liegt ganz oben). Ich möchte das Programm aber im Hintergrund laufen lassen, jedoch dass der Cursor dennoch versetzt wird.

    Das mit dem Cursor ist nur zum testen, später soll er sich die Koordinaten merken und nach einer bestimmten Zeit den Cursor dorthinsetzen.

    mfg supersass1



  • wieso erstellst du ein fenster wenn du das programm eh nur im hintergrund laufen lassen willst?

    EDIT: bei mir tut sich nichts wenn ich das ausführe aber wenn du auf mouseevents außerhalb deines fensters reagieren willst kommst du wohl um nen hook nicht herum



  • du meinst, das programm lediglich auf der switch-Answeisung beruhen?
    Okay, wäre einer Überlegung wert 😉



  • Wenn Du auf Mausbewegungen/-klicks, die nicht innerhalb Deiner Anwendung passieren, reagieren willst, musst Du einen Hook schreiben...



  • hat jemand ein gutes Tutorial für ein Hook?


  • Mod

    Was meinst Du denn mit "windowsweit"?

    Wenn dein Programm das einzige sein soll, dann trage es als Shell ein...



  • #include <windows.h>
    
    int main()
    {
       for(;;)
       {
          Sleep(1);
          if (0x8001 & GetAsyncKeyState (VK_LBUTTON))
             SetCursorPos (50, 50);
       }
    }
    

    🙂



  • Damit du mit den Hooks nicht ins Leere läufst:
    SetWindowsHookEx / UnhookWindowsHookEx

    Damit kannst du sämtliche Maus- oder Tastatur-Ereignisse systemweit abfangen und drauf reagieren. Das einzig umständliche ist, dass die Hook-Funktion, die bei jeder Maus-Aktion aufgerufen wird, in einer DLL liegen muss. Ansonsten aber alles recht einfach, einfach mal ausprobieren 🙂


Anmelden zum Antworten