[MSDN] Ottenere posizione mouse.

di il
4 risposte

[MSDN] Ottenere posizione mouse.

Ciao a tutti ragazzi.
Ho bisogno di un vostro aiuto ho cercato su internet, provato e riprovato ma non capisco , che volete sono tardo!!
Devo riuscire ad ottenere la posizione del cursore del mouse, quando quest'ultimo viene cliccato.
Fin qui sono riuscito, tuttavia la posizione restituita è in termini di pixel, io dovrei riuscire a convertirla in termini di caratteri char all'interno della console.
Se voi sapete come si fa e avete voglia di spiegarmelo ve ne sarei molto grato
Per quello che ho capito finora è che bisogna utilizzare la GetConsoleScreenBufferInfo, ma da qui in poi tabula rasa....

Vi allego quello che ho fatto:
POINT pt;
    while(1){
        if(GetAsyncKeyState(VK_RBUTTON)){
            GetCursorPos(&pt);
            printf("Coordinate: %I32d %I32d\n",pt.x,pt.y);
            break;
        }
    }

4 Risposte

  • Re: [MSDN] Ottenere posizione mouse.

    Aggiornamento...
    .h
    
    #ifndef UTILITY_H
    #define UTILITY_H
    
    #define  _WIN32_WINNT 0x0500
    #include <windows.h>
    #include <stdio.h>
    #include <unistd.h>
    #define DELAY 1000
    
    COORD Click_DX(void);
    
    #endif // UTILITY_H
    .c
    #include "Utility.h"
    
    static POINT Mouse_XY_Pixel(void){
        POINT p;
        HWND hWnd=GetConsoleWindow();
        GetCursorPos(&p);
        ScreenToClient(hWnd,&p);
        return p;
    }
    
    COORD Click_DX(void){
        POINT pt;
        CONSOLE_FONT_INFO cfi;
        HANDLE hStdout=GetStdHandle(STD_OUTPUT_HANDLE);
        while(1){
        	usleep(DELAY);
            if(GetAsyncKeyState(VK_RBUTTON)){
                pt=Mouse_XY_Pixel();
                if(GetCurrentConsoleFont(hStdout,0,&cfi)){
                    cfi.dwFontSize.X=pt.x/cfi.dwFontSize.X;
                    cfi.dwFontSize.Y=pt.y/cfi.dwFontSize.Y;
                    break;
                }
            }
        }
        return cfi.dwFontSize;
    }
    Ora le cose dovrebbero funzionare tuttavia non mi compila, in quanto non trova la funzione GetCurrentConsoleFont();
    Leggendo su MSDN dice che per compilare bisogna dichiarare una define _WIN32_WINNT 0x0500 , che ho fatto!!
    Se qualcuno potrebbe aiutarmi ve ne sarei grato.
    Utilizzo come IDE codeblocks, quindi mingw32-gcc come compilatore.
  • Re: [MSDN] Ottenere posizione mouse.

    Nanni16 ha scritto:


    Aggiornamento...
    Ora le cose dovrebbero funzionare tuttavia non mi compila, in quanto non trova la funzione GetCurrentConsoleFont();
    Leggendo su MSDN dice che per compilare bisogna dichiarare una define _WIN32_WINNT 0x0500 , che ho fatto!!
    Se qualcuno potrebbe aiutarmi ve ne sarei grato.
    Utilizzo come IDE codeblocks, quindi mingw32-gcc come compilatore.
    Ciao Nanni16, penso che sia difficile per chiunque risolvere il tuo problema se non ci dici l'output della compilazione!
    Sei sicuro di aver linkato tutte le librerie?
  • Re: [MSDN] Ottenere posizione mouse.

    Allora:

    .h
    #ifndef UTILITY_H
    #define UTILITY_H
    
    #define  _WIN32_WINNT 0x0500
    #include <windows.h>
    #include <stdio.h>
    #include <unistd.h>
    #define DELAY 1000
    #define SX 0
    #define DX 1
    
    COORD Click_Mouse(BOOL *flag);
    
    #endif // UTILITY_H
    
    .c
    #include "Utility.h"
    
    static POINT Mouse_XY_Pixel(void){
        POINT p;
        HWND hWnd=GetConsoleWindow();
        GetCursorPos(&p);
        ScreenToClient(hWnd,&p);
        return p;
    }
    
    COORD Click_Mouse(BOOL *flag){
        POINT pt;
        CONSOLE_FONT_INFO cfi;
        HANDLE hStdout=GetStdHandle(STD_OUTPUT_HANDLE);
        while(1){
            usleep(DELAY);
            if(GetAsyncKeyState(VK_LBUTTON)){
                pt=Mouse_XY_Pixel();
                if(GetCurrentConsoleFont(hStdout,0,&cfi)){
                    cfi.dwFontSize.X=pt.x/cfi.dwFontSize.X;
                    cfi.dwFontSize.Y=pt.y/cfi.dwFontSize.Y;
                    *flag=SX;
                    break;
                }
            }
            else if(GetAsyncKeyState(VK_RBUTTON)){
                pt=Mouse_XY_Pixel();
                if(GetCurrentConsoleFont(hStdout,0,&cfi)){
                    cfi.dwFontSize.X=pt.x/cfi.dwFontSize.X;
                    cfi.dwFontSize.Y=pt.y/cfi.dwFontSize.Y;
                    *flag=DX;
                    break;
                }
            }
        }
        return cfi.dwFontSize;
    }
    
    main
    #include <stdio.h>
    #include <stdlib.h>
    #include "Utility.h"
    
    int main(){
        BOOL flag;
        COORD a;
        int i;
        a=Click_Mouse(&flag);
        for(i=0;i<a.Y;i++)
            printf("\n");
        for(i=0;i<a.X;i++)
            printf(" ");
        printf("X");
        return 0;
    }
    
    Compilazione:
    mingw32-gcc.exe -Wall -g -c C:\Users\Nanni\Desktop\rge\main.c -o obj\Debug\main.o
    mingw32-gcc.exe -Wall -g -c C:\Users\Nanni\Desktop\rge\Utility.c -o obj\Debug\Utility.o
    C:\Users\Nanni\Desktop\rge\Utility.c: In function 'Click_Mouse':
    C:\Users\Nanni\Desktop\rge\Utility.c:19:13: warning: implicit declaration of function 'GetCurrentConsoleFont' [-Wimplicit-function-declaration]
    mingw32-g++.exe -o bin\Debug\rge.exe obj\Debug\main.o obj\Debug\Utility.o
    obj\Debug\Utility.o: In function `Click_Mouse':
    C:/Users/Nanni/Desktop/rge/Utility.c:19: undefined reference to `GetCurrentConsoleFont'
    C:/Users/Nanni/Desktop/rge/Utility.c:29: undefined reference to `GetCurrentConsoleFont'
    collect2.exe: error: ld returned 1 exit status
  • Re: [MSDN] Ottenere posizione mouse.

    Allora secondo gli output della compilazione, tu stai dichiarando implicitamente la funzione GetCurrentConsoleFont, questo di solito significa o che hai sbagliato a scrivere il nome funzione, ma ne dubito, o che non hai linkato la libreria giusta di conseguenza il compilatore quando legge GetCurrentConsoleFont non riesce a capire cosa deve fare.

    Da quanto mi risulta dalla documentazione devi linkare o la libreria Kernel32.lib oppure la libreria Kernel32.dll. Non ho mai usato windows per programmare ma presumo ci sia un comando di mingw32-gcc per linkare le librerie. Su gcc il comando è -llibreria_in_questione. consiglio di guardare sul manuale di mingw32-gcc.
Devi accedere o registrarti per scrivere nel forum
4 risposte