Hola:
Usando el Dev C++ con un hola mundo. En el título de la ventana quiero que me diga el nombre del programa. El programa es hecho en modo consola.
He buscado por google (https://www.google.es/?gfe_rd=cr&ei=58GzVpyqG8-s8wf-jaeQBA&gws_rd=ssl#q=nombre+consola+dev+c%2B%2B&safe=off&start=10) y me dice cambiar el color, pero eso es dentro del programa, no quiero cambiar colores, solo el nombre o título.
Espero que se entienda lo que quiero decir. También hay que ver si en consola es posible hacerlo en Dev C++, en C# se hace así:
Console.title = "Título o nombre del programa";
Estamos en C++ Win32 en modo consola.
Saludos.
Con la API SetConsoleTitle.
https://msdn.microsoft.com/es-es/library/windows/desktop/ms686050%28v=vs.85%29.aspx
saludos.
Gracias.
He intentado ponerlo en este código pero sale error en el Dev C++ 5.11.
#include <iostream>
#include <cstring>
#include <windows.h>
// No olvidar.
#include <tchar.h>
//#include <conio.h>
//#include <strsafe.h>
using namespace std;
// Tipos de datos:
typedef struct
{
char Puerto[5];
int Baudios;
int BitsDatos;
int BitsStop;
char Paridad[25];
} tipoOpciones;
bool ocupado;
// Prototipos:
HANDLE InicioComunicacion(tipoOpciones*);
bool FinComunicacion(HANDLE);
DWORD Hilo(LPDWORD lpdwParam);
void EscribirSerie(HANDLE, char *);
int main(int argc, char *argv[])
{
TCHAR szOldTitle[MAX_PATH];
TCHAR szNewTitle[MAX_PATH];
// Save current console title.
if( GetConsoleTitle(szOldTitle, MAX_PATH) )
{
// Build new console title string.
StringCchPrintf(szNewTitle, MAX_PATH, TEXT("TEST: %s"), szOldTitle);
// Set console title to new title
if( !SetConsoleTitle(szNewTitle) )
{
_tprintf(TEXT("SetConsoleTitle failed (%d)\n"), GetLastError());
return 1;
}
else
{
_tprintf(TEXT("SetConsoleTitle succeeded.\n"));
}
}
return 0;
bool salir=false;
DWORD id;
char cad[80];
tipoOpciones Ops; // Opciones
HANDLE idComDev;
HANDLE hHilo; // Hilo del puerto serie
ocupado = true;
// Inicializar opciones del puerto serie:
strcpy(Ops.Puerto, "COM1");
Ops.Baudios = 115200;
Ops.BitsDatos = 8;
Ops.BitsStop = 2;
strcpy(Ops.Paridad, "Sin paridad");
// No se ha establecido comunicación:
idComDev = InicioComunicacion(&Ops);
if(idComDev == INVALID_HANDLE_VALUE) {
cout << "Inicialización puerto serie" << endl;
cout << "ERROR: No se puede acceder al puerto serie." << endl;
return 1;
}
// Lanzar hilo de lectura del puerto serie:
hHilo = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Hilo, (LPDWORD)&idComDev, 0, &id);
if(!hHilo) cout << "Error" << endl;
// Bucle principal:
ocupado = false;
while(!salir) {
// Leer un comando:
cin.getline(cad, 80);
// Si es "salir", abandonar el bucle:
if(!strcmp(cad, "salir")) salir = true;
else {
// Si no, enviar cadena por el puerto serie:
strcat(cad, "\r");
EscribirSerie(idComDev, cad);
}
}
// Liberar hilo:
CloseHandle(hHilo);
// Liberar puerto serie:
FinComunicacion(idComDev);
return 0;
}
// Iniciar el puerto serie:
HANDLE InicioComunicacion(tipoOpciones *Ops)
{
bool fSuccess;
HANDLE idComDev;
DCB dcb; // Puerto serie
// Abrir el fichero asociado al puerto:
idComDev = CreateFile(Ops->Puerto, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
if(idComDev == INVALID_HANDLE_VALUE) {
cout << "ERROR: CreateFile. Inicialización puerto serie" << endl;
return INVALID_HANDLE_VALUE;
}
PurgeComm(idComDev, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
// Leer estructura de control del puerto serie, cdb:
fSuccess = GetCommState(idComDev, &dcb);
if(!fSuccess) {
cout << "ERROR: GetCommState. Inicialización puerto serie" << endl;
// Cerrar el puerto, regresar con 0.
CloseHandle(idComDev);
return INVALID_HANDLE_VALUE;
}
// Modificar el dcb según las opciones definidas:
dcb.BaudRate = Ops->Baudios;
dcb.ByteSize = Ops->BitsDatos;
if(!strcmp(Ops->Paridad, "Sin paridad")) dcb.Parity = NOPARITY;
if(!strcmp(Ops->Paridad, "Paridad par")) dcb.Parity = EVENPARITY;
if(!strcmp(Ops->Paridad, "Paridad impar")) dcb.Parity = ODDPARITY;
switch(Ops->BitsStop) {
case 1:
dcb.StopBits = ONESTOPBIT;
break;
case 2:
dcb.StopBits = TWOSTOPBITS;
break;
}
// Modificar la estructura de control del puerto serie:
fSuccess = SetCommState(idComDev, &dcb);
if(!fSuccess) {
cout << "ERROR: SetCommStatus. Inicialización puerto serie" << endl;
// Cerrar el puerto, regresar con 0.
CloseHandle(idComDev);
return INVALID_HANDLE_VALUE;
}
//// ASIGNAR TIMOUTS!!!
return idComDev;
}
// Finalizar comunicación por puerto serie:
bool FinComunicacion(HANDLE idComDev)
{
// Cerrar el puerto serie:
CloseHandle(idComDev);
return true;
}
// Hilo de escucha del puerto serie:
DWORD Hilo(LPDWORD lpdwParam)
{
DWORD leidos;
COMSTAT cs;
char *cad;
DWORD dwCommEvent;
HANDLE idComDev = *((HANDLE*)lpdwParam);
if(!SetCommMask(idComDev, EV_RXCHAR)) {
cout << "Error al iniciar captura de evento" << endl;
return 0;
}
do {
if(WaitCommEvent(idComDev, &dwCommEvent, NULL)) {
SetCommMask(idComDev, EV_RXCHAR);
while(ocupado);
ocupado = true;
if(dwCommEvent & EV_RXCHAR) {
ClearCommError(idComDev, &leidos, &cs);
leidos=0;
cout << "Detectados " << cs.cbInQue << " caracteres" << endl;
/* Leer buffer desde puerto serie */
if(cs.cbInQue) {
cad = new char[cs.cbInQue+3]; // Caracteres en buffer, más retorno de línea, más nulo
ReadFile(idComDev, cad, cs.cbInQue, &leidos, NULL);
cad[leidos] = '\n'; // Terminar cadena con salto de línea y nulo
cad[leidos+1] = '\r';
cad[leidos+2] = 0;
cout << cad;
delete[] cad;
}
} else {
cout << "Evento: EV_BREAK o EV_ERR" << endl;
ClearCommBreak(idComDev);
}
ocupado = false;
} else {
cout << "Error en WaitCommEvent" << endl;
ClearCommError(idComDev, NULL, NULL);
}
Sleep(10);
} while(true);
return 0;
}
void EscribirSerie(HANDLE idComDev, char *buf)
{
char oBuffer[256]; /* Buffer de salida */
DWORD iBytesWritten;
iBytesWritten = 0;
strcpy(oBuffer, buf);
while(ocupado);
ocupado = true;
WriteFile(idComDev, oBuffer, strlen(oBuffer), &iBytesWritten, NULL);
ocupado = false;
}
47 73 C:\Users\Meta\Desktop\main.cpp [Error] 'StringCchPrintf' was not declared in this scope
Saludos.
El include de la cabecera necesaria esta comentado.
https://msdn.microsoft.com/en-us/library/windows/desktop/ms647541%28v=vs.85%29.aspx
Hola:
Lo traduc (https://translate.google.com/translate?sl=en&tl=es&js=y&prev=_t&hl=es&ie=UTF-8&u=https%3A%2F%2Fmsdn.microsoft.com%2Fes-es%2Flibrary%2Fwindows%2Fdesktop%2Fms647541%2528v%3Dvs.85%2529.aspx%3Ff%3D255%26MSPPError%3D-2147217396&edit-text=)í, lo que busco simplemente es esto.
(http://osl2.uca.es/wikijuegos/w/images/thumb/450px-Titulo.png)
Saludos.
No fue suficiente, el error es por StringCchPrintf, tenes que incluir strsafe.h, linea 7, la tenes comentada.
Hola:
Me da otros errores indicado en el código de abajo.
#include <iostream>
#include <cstring>
#include <windows.h>
// No olvidar.
#include <tchar.h>
#include <conio.h>
#include <strsafe.h>
using namespace std;
// Tipos de datos:
typedef struct
{
char Puerto[5];
int Baudios;
int BitsDatos;
int BitsStop;
char Paridad[25];
} tipoOpciones;
bool ocupado;
// Prototipos:
HANDLE InicioComunicacion(tipoOpciones*);
bool FinComunicacion(HANDLE);
DWORD Hilo(LPDWORD lpdwParam);
void EscribirSerie(HANDLE, char *);
int main(int argc, char *argv[])
{
TCHAR szOldTitle[MAX_PATH];
TCHAR szNewTitle[MAX_PATH];
// Save current console title.
if( GetConsoleTitle(szOldTitle, MAX_PATH) )
{
// Build new console title string.
StringCchPrintf(szNewTitle, MAX_PATH, TEXT("TEST: %s"), szOldTitle);
// Set console title to new title
if( !SetConsoleTitle(szNewTitle) )
{
_tprintf(TEXT("SetConsoleTitle failed (%d)\n"), GetLastError());
return 1;
}
else
{
_tprintf(TEXT("SetConsoleTitle succeeded.\n"));
}
}
return 0;
bool salir=false;
DWORD id;
char cad[80];
tipoOpciones Ops; // Opciones
HANDLE idComDev;
HANDLE hHilo; // Hilo del puerto serie
ocupado = true;
// Inicializar opciones del puerto serie:
strcpy(Ops.Puerto, "COM1");
Ops.Baudios = 115200;
Ops.BitsDatos = 8;
Ops.BitsStop = 2;
strcpy(Ops.Paridad, "Sin paridad");
// No se ha establecido comunicación:
idComDev = InicioComunicacion(&Ops);
if(idComDev == INVALID_HANDLE_VALUE) {
cout << "Inicialización puerto serie" << endl;
cout << "ERROR: No se puede acceder al puerto serie." << endl;
return 1;
}
// Lanzar hilo de lectura del puerto serie:
hHilo = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Hilo, (LPDWORD)&idComDev, 0, &id);
if(!hHilo) cout << "Error" << endl;
// Bucle principal:
ocupado = false;
while(!salir) {
// Leer un comando:
cin.getline(cad, 80);
// Si es "salir", abandonar el bucle:
if(!strcmp(cad, "salir")) salir = true;
else {
// Si no, enviar cadena por el puerto serie:
strcat(cad, "\r");
EscribirSerie(idComDev, cad);
}
}
// Liberar hilo:
CloseHandle(hHilo);
// Liberar puerto serie:
FinComunicacion(idComDev);
return 0;
}
// Iniciar el puerto serie:
HANDLE InicioComunicacion(tipoOpciones *Ops)
{
bool fSuccess;
HANDLE idComDev;
DCB dcb; // Puerto serie
// Abrir el fichero asociado al puerto:
idComDev = CreateFile(Ops->Puerto, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
if(idComDev == INVALID_HANDLE_VALUE) {
cout << "ERROR: CreateFile. Inicialización puerto serie" << endl;
return INVALID_HANDLE_VALUE;
}
PurgeComm(idComDev, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
// Leer estructura de control del puerto serie, cdb:
fSuccess = GetCommState(idComDev, &dcb);
if(!fSuccess) {
cout << "ERROR: GetCommState. Inicialización puerto serie" << endl;
// Cerrar el puerto, regresar con 0.
CloseHandle(idComDev);
return INVALID_HANDLE_VALUE;
}
// Modificar el dcb según las opciones definidas:
dcb.BaudRate = Ops->Baudios;
dcb.ByteSize = Ops->BitsDatos;
if(!strcmp(Ops->Paridad, "Sin paridad")) dcb.Parity = NOPARITY;
if(!strcmp(Ops->Paridad, "Paridad par")) dcb.Parity = EVENPARITY;
if(!strcmp(Ops->Paridad, "Paridad impar")) dcb.Parity = ODDPARITY;
switch(Ops->BitsStop) {
case 1:
dcb.StopBits = ONESTOPBIT;
break;
case 2:
dcb.StopBits = TWOSTOPBITS;
break;
}
// Modificar la estructura de control del puerto serie:
fSuccess = SetCommState(idComDev, &dcb);
if(!fSuccess) {
cout << "ERROR: SetCommStatus. Inicialización puerto serie" << endl;
// Cerrar el puerto, regresar con 0.
CloseHandle(idComDev);
return INVALID_HANDLE_VALUE;
}
//// ASIGNAR TIMOUTS!!!
return idComDev;
}
// Finalizar comunicación por puerto serie:
bool FinComunicacion(HANDLE idComDev)
{
// Cerrar el puerto serie:
CloseHandle(idComDev);
return true;
}
// Hilo de escucha del puerto serie:
DWORD Hilo(LPDWORD lpdwParam)
{
DWORD leidos;
COMSTAT cs;
char *cad;
DWORD dwCommEvent;
HANDLE idComDev = *((HANDLE*)lpdwParam);
if(!SetCommMask(idComDev, EV_RXCHAR)) {
cout << "Error al iniciar captura de evento" << endl;
return 0;
}
do {
if(WaitCommEvent(idComDev, &dwCommEvent, NULL)) {
SetCommMask(idComDev, EV_RXCHAR);
while(ocupado);
ocupado = true;
if(dwCommEvent & EV_RXCHAR) {
ClearCommError(idComDev, &leidos, &cs);
leidos=0;
cout << "Detectados " << cs.cbInQue << " caracteres" << endl;
/* Leer buffer desde puerto serie */
if(cs.cbInQue) {
cad = new char[cs.cbInQue+3]; // Caracteres en buffer, más retorno de línea, más nulo
ReadFile(idComDev, cad, cs.cbInQue, &leidos, NULL);
cad[leidos] = '\n'; // Terminar cadena con salto de línea y nulo
cad[leidos+1] = '\r';
cad[leidos+2] = 0;
cout << cad;
delete[] cad;
}
} else {
cout << "Evento: EV_BREAK o EV_ERR" << endl;
ClearCommBreak(idComDev);
}
ocupado = false;
} else {
cout << "Error en WaitCommEvent" << endl;
ClearCommError(idComDev, NULL, NULL);
}
Sleep(10);
} while(true);
return 0;
}
void EscribirSerie(HANDLE idComDev, char *buf)
{
char oBuffer[256]; /* Buffer de salida */
DWORD iBytesWritten;
iBytesWritten = 0;
strcpy(oBuffer, buf);
while(ocupado);
ocupado = true;
WriteFile(idComDev, oBuffer, strlen(oBuffer), &iBytesWritten, NULL);
ocupado = false;
}
Línea 64.
Citar71 5 C:\Users\Usuario\Desktop\main.cpp [Error] 'strcpy_instead_use_StringCbCopyA_or_StringCchCopyA' was not declared in this scope
Línea 89.
Citar89 13 C:\Users\Usuario\Desktop\main.cpp [Error] 'strcat_instead_use_StringCbCatA_or_StringCchCatA' was not declared in this scope
Línea 216.
Citar216 5 C:\Users\Usuario\Desktop\main.cpp [Error] 'strcpy_instead_use_StringCbCopyA_or_StringCchCopyA' was not declared in this scope
No tienen nada que ver con cambiar el titulo de la consola, es muy dificil hacer un programa copiando y pegando si uno no comprende el lenguaje.
SetConsoleTitleA("123");
SetConsoleTitleW(L"123");