martes, 25 de mayo de 2010

Obtén información del sistema con GetSystemMetrics()

0

Si alguna vez necesitaste o te preguntaste como obtener la resolución de la pantalla, si el ratón tiene rueda, cuantos botones u otra información con la función GetSystemMetrics() lo podrás saber.

#include <windows.h>
#include <iostream>

using namespace std;

int main()
{
    cout << "Numero de monitores: " << GetSystemMetrics(SM_CMONITORS) << endl;
    cout << "Tamaño de la pantalla principal: ";
    cout << GetSystemMetrics(SM_CXSCREEN) <<'x'<< GetSystemMetrics(SM_CYSCREEN);
    cout << endl << endl;

    if (GetSystemMetrics(SM_NETWORK))
        cout << "Hay red presente";
    else
        cout << "No hay red presente";
    cout << endl << endl;

    if (!GetSystemMetrics(SM_MOUSEPRESENT))
        cout << "No tiene un raton conectado" << endl;
    else
    {
        cout << "Tiene un raton conectado" << endl;
        if (GetSystemMetrics(SM_MOUSEWHEELPRESENT))
            cout << "El raton tiene rueda" << endl;
        else
            cout << "El raton no tiene rueda" << endl;
        int n = GetSystemMetrics(SM_CMOUSEBUTTONS);
        cout << "El raton tiene " << n <<" botones" << endl << endl;
    }
}

Ver toda la información de GetSystemMetrics() en español.

Seguramente también te sea útil la función SystemParametersInfo()

Comparte o puntua esta publicación ▼

lunes, 17 de mayo de 2010

Iniciar el protector de pantalla, C++

0

Muy parecido a la manera de apagar la o las pantallas a la vez mediante un pequeño ejecutable, se trata de un pequeño código que, una vez creado el ejecutable, podrás abrir el protector de pantalla cuando quieras.

#include <windows.h>

int main()
{
    SendMessage(GetForegroundWindow(), WM_SYSCOMMAND, SC_SCREENSAVE, 0);
}

¿Y si hacemos un protector de pantalla que al cerrarse ejecute este código? Que pasara...

Actualizado el 1/12/2011

Comparte o puntua esta publicación ▼

lunes, 10 de mayo de 2010

Clase para reproducir sonido con MCI

0

Esta tarde he estado haciendo un clase para poder reproducir música en formatos como mp3, wav, y dependiendo del sistema operativo o codecs instalados aac, ogg, pero no estoy seguro.

Para ello uso MCI, que realmente vale para muchísimas otras cosas, como reproducir o capturar vídeo de un archivo o de hardware como una webcam, reproducir midi y formatos anteriores,...

#include <windows.h>
#include <iostream>
#include <string>

enum mode {unknown, open, playing, paused, stopped };

class MCI
{
    // davidxl.blogspot.com
    private:
        std::string filename;
        unsigned int lenght;
        int volume;
        int balance;

    public:
        MCI() : lenght(0),volume(1000),balance(0)
        {

        };

        MCI(std::string filename): volume(1000),balance(0)
        {
            Open(filename);
        };

        ~MCI()
        {
            Close();
        }

        void Open(std::string filename)
        {
            Close();
            this->filename = filename;
            std::string msg = "open \"" + filename + "\" type mpegvideo alias " + filename;
            mciSendString(msg.c_str(), NULL, 0, 0);
            lenght = Lenght(true);
        }

        void Play(int pos = 0)
        {
            char *buff = new char[10];
            std::string msg = "play " + filename + " from " + itoa(pos,buff,10);
            mciSendString(msg.c_str(), NULL, 0, 0);
            delete [] buff;
        }

        void Seek(int pos)
        {
            char *buff = new char[10];
            std::string msg = "seek " + filename + " to " + itoa(pos,buff,10);
            mciSendString(msg.c_str(), NULL, 0, 0);
            delete [] buff;
        }

        void Pause()
        {
            std::string msg = "pause " + filename;
            mciSendString(msg.c_str(), NULL, 0, 0);
        }

        void Resume()
        {
            std::string msg = "resume " + filename;
            mciSendString(msg.c_str(), NULL, 0, 0);
        }

        void Stop()
        {
            std::string msg = "stop " + filename;
            mciSendString(msg.c_str(), NULL, 0, 0);
        }

        void Close()
        {
            std::string msg = "close " + filename;
            mciSendString(msg.c_str(), NULL, 0, 0);
        }

        int Volume()
        {
            return volume;
        }

        void Volume(int vol)
        {
            vol = (vol < 0 ? 0 : (vol > 1000 ? 1000 : vol));
            char *buff = new char[5];
            std::string msg = "setaudio " + filename + " volume to " + itoa(vol,buff,10);
            mciSendString(msg.c_str(), NULL, 0, 0);
            delete [] buff;
        }

        int Balance()
        {
            return balance;
        }

        void Balance(int bal)
        {
            bal = (bal < -1000 ? -1000 : (bal > 1000 ? 1000 : bal));
            char *buff = new char[5];
            std::string msg = "setaudio " + filename + "left volume to " + itoa((bal<0?1000:1000-bal),buff,10);
            mciSendString(msg.c_str(), NULL, 0, 0);
            msg = "setaudio " + filename + "right volume to " + itoa((bal>0?1000:1000+bal),buff,10);
            mciSendString(msg.c_str(), NULL, 0, 0);
            delete [] buff;
        }

        int Lenght(bool refresh = false)
        {
            if (refresh)
            {
                char *buff = new char[128];
                std::string msg = "status " + filename + " length";
                mciSendString(msg.c_str(), buff, 128, 0);
                int t = atoi(buff);
                delete [] buff;
                return t;
            }
            else
            {
                return lenght;
            }
        }

        int Position()
        {
            char *buff = new char[16];
            std::string msg = "status " + filename + " position";
            mciSendString(msg.c_str(), buff, 16, 0);
            int t = atoi(buff);
            delete [] buff;
            return t;
        }

        int Position(int ms)
        {
            if (status() == playing || status() == paused)
                Seek(ms);
            else
                Play(ms);
        }

        mode status()
        {
            char *buff = new char[8];
            std::string msg = "status " + filename + " mode";
            mciSendString(msg.c_str(), buff, 8, 0);
            mode ret;
            if (strncmp(buff,"open",4) == 0) ret = open;
            else if (strncmp(buff,"playing",7) == 0) ret = playing;
            else if (strncmp(buff,"paused",6) == 0) ret = paused;
            else if (strncmp(buff,"stopped",7) == 0) ret = stopped;
            else ret = unknown;
            delete [] buff;
            return ret;
        }
};

int main()
{
    MCI mp3("C:\\1.mp3");
    std::cout << mp3.Lenght()/60000.0 << std::endl; // en minutos
    mp3.Play();
    std::cout << "Pulsa F8 para salir" << std::endl;
    while (!GetAsyncKeyState(VK_F8))
    {
        std::cout << "\r" << mp3.Position()/60000.0;
        Sleep(500);
    }
    mp3.Stop();
    return 0;
}

Por si no te das cuanta el tiempo es tratado en milisegundos. También e de decir que no lo he probado todo, puede que haya métodos que no funcionen del todo bien, en fin, si te encuentras con algún error o mejora simplemente comenta.

Comparte o puntua esta publicación ▼

Manejando el mouse

0

Un par de ejemplos de como obtener las coordenadas del cursor y de como posicionarlo en una posición concreta.

#include 
#include 

int main()
{
    POINT p;
    while(!GetAsyncKeyState(VK_F8))
    {
        GetCursorPos(&p);
        std::cout << p.x << " - " << p.y << std::endl;
    }
    return 0;
}

Sitúa el ratón en la posición (0,0) hasta que se pulse la tecla F8

#include 

int main()
{
      FreeConsole();
      while(!GetAsyncKeyState(VK_F8))
          SetCursorPos(0,0);
}

Comparte o puntua esta publicación ▼

domingo, 9 de mayo de 2010

Usando Hotkeys con C, C++

1

Las teclas globales o hotkeys son teclas o combinaciones de teclas cuya pulsación puede ser captada sin que el programa tenga el foco.

El programa de ejemplo que muestro, al ejecutarse no veras nada, ni ventana, ni consola, se trata de un proceso que capta unas teclas (mira las funciones RegisterHotKey), para salir pulsa la tecla de escape y tendría que aparecer un mensajito con el texto "bye bye".

#include <windows.h>

#define CTRL_ALT_F1 101
#define CTRL_F2     102
#define ALT_F3      103
#define CTRL_UP     104
#define CTRL_DOWN   105
#define CTRL_RIGHT  106
#define CTRL_LEFT   107
#define EXIT_KEYS   108

LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);
char Name[] = "HotKey demo - DavidXL";

int WINAPI WinMain ( HINSTANCE hInst,HINSTANCE hPrevInst,
                     LPSTR lpszArgument,int nFunsterStil )
{
    HWND hwnd;
    MSG messages;

    WNDCLASSEX wincl = {sizeof(WNDCLASSEX),0,WinProc,0,0,hInst,0,0,0,0,Name,0};
    if (!RegisterClassEx (&wincl)) return 1;
    hwnd = CreateWindowEx(0,Name,Name,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
                          CW_USEDEFAULT,0,0,HWND_DESKTOP,NULL,hInst,NULL );

    RegisterHotKey(hwnd, CTRL_ALT_F1, MOD_CONTROL|MOD_ALT, VK_F1);
    RegisterHotKey(hwnd, CTRL_F2, MOD_CONTROL, VK_F2);
    RegisterHotKey(hwnd, ALT_F3, MOD_ALT, VK_F3);
    RegisterHotKey(hwnd, CTRL_UP, MOD_CONTROL, VK_UP);
    RegisterHotKey(hwnd, CTRL_DOWN, MOD_CONTROL, VK_DOWN);
    RegisterHotKey(hwnd, CTRL_RIGHT, MOD_CONTROL, VK_RIGHT);
    RegisterHotKey(hwnd, CTRL_LEFT, MOD_CONTROL, VK_LEFT);
    RegisterHotKey(hwnd, EXIT_KEYS, 0 , VK_ESCAPE);

    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
    return messages.wParam;
}

LRESULT CALLBACK WinProc( HWND hwnd, UINT message,
                                  WPARAM wParam, LPARAM lParam )
{
    switch (message)
    {
        case WM_HOTKEY:
            switch(wParam)
            {
                  case CTRL_ALT_F1:
                       MessageBox(NULL, "CTRL_ALT_F1", Name, MB_OK);
                  break;
                  case CTRL_F2:
                       MessageBox(NULL, "CTRL_F2", Name, MB_OK);
                  break;
                  case ALT_F3:
                       MessageBox(NULL, "ALT_F3", Name, MB_OK);
                  break;
                  case CTRL_UP:
                       MessageBox(NULL, "CTRL_UP", Name, MB_OK);
                  break;
                  case CTRL_DOWN:
                       MessageBox(NULL, "CTRL_DOWN", Name, MB_OK);
                  break;
                  case CTRL_RIGHT:
                       MessageBox(NULL, "CTRL_RIGHT", Name, MB_OK);
                  break;
                  case CTRL_LEFT:
                       MessageBox(NULL, "CTRL_LEFT", Name, MB_OK);
                  break;
                  case EXIT_KEYS:
                       MessageBox(NULL, "bye bye", Name, MB_OK);
                       PostQuitMessage(0);
                  break;
            }
            break;
        case WM_DESTROY:
            PostQuitMessage (0);
            break;
        default:
            return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}
Comparte o puntua esta publicación ▼

sábado, 8 de mayo de 2010

gotoxy() sin el encabezado conio.h

0

La función gotoxy(), que permite escribir en cualquier parte de la pantalla, esta declarada en el encabezado <conio.h>, la cual viene en los compiladores del Turbo C y Borland C++, pero si usas otro compilador esta función no existe. La cabecera <conio.h> fue portada a otros compiladores pero actualmente ya se encuentra obsoleta, sin embargo todavía se siguen viendo muchas lineas de código que incluyen esta función. Para poder compilar antiguos programas que usaban esta función con los compiladores de hoy en día, lo mejor es usar una función equivalente y deshacernos de <conio.h>

#include <windows.h>
#include <iostream>

using namespace std;

bool gotoxy(unsigned short x, unsigned short y)
{
   HANDLE hstdout;

   if ((hstdout = GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
      return false;

   if (SetConsoleCursorPosition(hstdout, (COORD){x,y}) == 0)
      return false;

   return true;
}

int main()
{
    gotoxy(23,10);
    cout << "DavidXL -> davidxl.blogspot.com" << endl;
    gotoxy(20,23);

    return 0;
}

Si se va a usar mucho seria mejor, mas eficiente "sacar" de la función algunas lineas que solo hace falta que se ejecuten una vez, y así va mas rápido.

#include <windows.h>
#include <iostream>

using namespace std;

HANDLE hstdout;

void gotoxy(unsigned short x, unsigned short y)
{
   SetConsoleCursorPosition(hstdout, (COORD){x,y});
}

int main()
{
    hstdout = GetStdHandle(STD_OUTPUT_HANDLE);

    gotoxy(23,10);
    cout << "DavidXL -> davidxl.blogspot.com" << endl;
    gotoxy(20,23);

    return 0;
}

Me he estado riendo un rato con esto que leí en un foro:

No la utilices, es un crimen, es la llamada programación spaguetti xD
Comparte o puntua esta publicación ▼

jueves, 6 de mayo de 2010

Reproducir sonidos con c++ y sndPlaySound()

2

En este post muestro una manera fácil y rápida de reproducir sonidos en formato wav, muy útil para pequeños juegos y aplicaciones.

Para ello la función usada es sndPlaySound(), incluida en <mmsystem.h>. A la hora de hacer el link se necesita la librería winmm.lib, si te la pide y no sabes donde encontrarla, yo use la que viene con el kit de desarrollo de Windows 7, "Windows 7 SDK".

Es recomendable visitar la pagina de la función sndPlaySound() para conocer todos los posibles flags, ya que en el ejemplo solo muestro una implementación básica.

#include <windows.h>
#include <mmsystem.h>

int main()
{
    sndPlaySound("file.wav", SND_ASYNC | SND_FILENAME | SND_LOOP);
    system("PAUSE");
    return 0;
}
Comparte o puntua esta publicación ▼

miércoles, 5 de mayo de 2010

Analizar los argumentos de la línea de comandos

0

Este programa de ejemplo permite la entrada de parámetros realizando un análisis básico, tal como esta es muy fácil extender las posibilidades de la entrada de argumentos para tu programa.

#include <iostream>
#include <string>

using namespace std;

void Usage()
{
    cout << "Uso: myApp -z -n <nombre> -a <apellido> -h" << endl;
    cout << "o:   myApp /z /n <nombre> /a <apellido> /h" << endl;;
}

int main(int argc, char* argv[])
{
    bool z = false;
    string name;
    string ape;

    int i;

    if (argc < 2)
    {
        Usage();
        return 1;
    }

    for (i=1; i < argc ;i++)
    {
        if (strlen(argv[i]) < 2)
            continue;

        if (argv[i][0] == '-' || argv[i][0] == '/')
        {
            switch (argv[i][1])
            {
                case 'z':
                    z = true;
                    break;
                case 'n':
                    name = argv[i+1];
                    break;
                case 'a':
                    ape = argv[i+1];
                    break;
                case 'h':
                    Usage();
                    return 0;
                default:
                    cout << "Comando '-" << argv[i][1] << "' no valido.";
                    return 1;
            }
        }
    }
    cout << "Z = " << z <<endl;
    cout << "Nombre = " << name <<endl;
    cout << "Apellido = " << ape <<endl;

    system("pause");
    return 1;
}
Comparte o puntua esta publicación ▼