elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


  Mostrar Temas
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [16] 17 18 19
151  Informática / Hardware / Pendrive hace un ruido extraño. Apagado. en: 18 Junio 2019, 06:56 am
Me encontré un pendrive. Lo iva a meter en el pc, pero cada cierto tiempo hace un ruido como si fuese exactamente el click de un ratón.
Pensé que era por el cambio de temperatura que algo hacia un pequeño estallido. O que algo estaba suelto dentro. Pero los estallidos no siguen patrones.
Hace el click y al medio segundo hace otro click y no lo vuelve hacer hasta dentro de cierto tiempo. 
Wtf???

Idea de que es eso? Lo he sacudido fuerte varias veces y tanto por ruido como por tacto estoy 100% seguro que no hay nada que se mueva de forma no mecánica.

Teneis la más minima idea que puede ser? Cuando llegue a casa lo meteré en un pc del año de la polka para mirar el modelo exacto, lo que tiene, etc.
152  Programación / Programación C/C++ / Alguna manera de probar un programa con sockets en un solo pc? en: 17 Junio 2019, 04:19 am
Estoy haciendo una herramienta para administración remota, y me gustaría poder probar que todo funciona tras compilar sin necesitad de router, virtualización, uso de 2 equipos, etc.

Me preguntaba si había alguna forma de probarlo desde un solo equipo de forma rápida. Ya sea añadiendo algo al codigo, o algo modificando la configuración.
Ando haciendo muchos ajustes, y cada ajuste podría cargarse todo. Si tengo que pasarle a un amigo el servidor cada vez que realice un pequeño cambio, dejará de ser mi amigo. Jajaja.
A parte que es molesto tener que andar a mandar el bin cada vez que compile por no poder comprobar directamente que todo funciona.
Uso winsock2 C++ Codeblocks si esa info ayuda en algo.
153  Foros Generales / Sugerencias y dudas sobre el Foro / Ningún link en el foro que no rediriga al https? en: 16 Junio 2019, 08:09 am
No hay ninguna regla en el .htaccess para usar el foro con http con alguna url que no redirija al https?
Estoy usando una versión modificada de Lynx https://github.com/kurtchen/Lynx/tree/master/src que no tiene soporte para https y no puedo entrar.
154  Programación / Programación C/C++ / Obtener Int de un EDIT y otros problemas. Windows Api. en: 13 Junio 2019, 20:46 pm
Hola, estoy haciendo un programa que va a tener un montón de opciones y cifrados distintos.

Primer problema: Tengo un control EDIT de una linea por el cual quiero obtener el input del usuario en una variable int. Para posteriormente hacer la llamada al cifrado. De momento tengo los numeros en un string.
Me gustaría obtener los números directamente en un int desde el EDIT o hacer un cast del string en el cual ya los tengo a un int.
El into lo quiero para saber el número de vueltas que el usuario quiere aplicarle al cifrado Cesar.

Segundo problema: No sé como mostrar el resultado del cifrado de uno de los EDIT que tengo para ello.
Quiero mostrar el contenido del string en el EDIT.

A parte de eso voy a cambiar el tamaño de todo cuando se le de a maximizar. Creo que es bastante sencillo metiendo dentro del swtich (msg) un case con maximizar y dentro todas las ventanas con nuevos ajustes (Copio y pego las actuales y les multiplico w, x, y, z por el mismo numero y debería quedar todo más o menos igual pero más grande. Tendría que cambiar el tamaño de ka fuente de todas la letras.

También quiero detectar el tamaño/resolución del escritorio para redimensionar y que quede lo mejor posible independientemente de la resolucion. Actualmente se ve pequeña la ventana porque hice la gui en 800x600. Podría guardar el tamaño del escritorio en pixeles y hacer operaciones con esas variables para ubicar las ventanas y determinar su tamaño.

Quiero añadir scrollbars a los EDIT grandes. Me imagino que tengo que crear los scrollbars como un elemento independiente y pasarle los handler de los EDIT que quiero que manejen? Nada más no?

La gui la cambiaré, sobre todo colores. Y al maximizar también mostrare opciones avanzadas que no se ven con la ventana normal.

También quiero añadir un menu desplegable con opción para diversos cifrados y que al poner el cursor encima salga una descripción de cada cifrado. No sé muy bien cual es el control adecuado ni como implementarlo.

Tener la opción de aplicar diversos cifrados a la vez, creando un perfil para el usuario con sus ajustes, su convinación de cifrados, etc. En principio lo haría con archivos .txt a menos que exista otra forma de gestionar estos perfiles en la Api. Crear, abrir, borrar, guardar
Por ejemplo un perfil podría ser: Rot13 + Base64 + Rot13.
Asi un usuario que solo utilice el programa para hacer esta convinación de cifrados, no tiene que ir uno por uno aplicándolos. Sería muy molesto si tienes una convinación de 20 cifrados tener que aplicarlos todos uno por uno. Y lo mismo a la hora de descifrarlos.
La idea es añadir estos perfiles nombrados por el usuario en la lista de cifrados disponibles.
Por ejemplo yo elijo Rot13 + Base64 + Rot13 y le llamo Cifrado Manolo.
Pues en la lista desplegable tendría para elegir:
Cifrado Manolo
Cesar
Interseccion
Rot13
Base64
...
No sé exactamente como hacer esto ni como suelen hacerlo los programas.

De momento lo que me preocupa son el primer problema y el segundo. El resto más o menos podré ir haciéndolo a base de prueba y error y buscando en google. Lo comento por si sabeis alguna manera de implementarlo de una forma correcta o si mi approach es equívoco.

El proyecto va a ser grande. Tengo una lista de 200 cifrados distintos que iré implementando mediante funciones a lo largo del tiempo.
Cualquier consejo o cifrado poco común que querais ver lo agradeceré mucho.
El programa va a ser código abierto para que quien quiera lo despedace, use las funciones, haga un programa comercial o lo que sea.

Esa es más o menos mi idea. Cualquier recomendación o crítica será bienvenida.

Código
  1. /*
  2. Proyecto compilado en:
  3. C++11.
  4. Code::Blocs 17.12
  5. Other Linker Settings:
  6. -lmingw32
  7. */
  8.  
  9. /*
  10. Por anhadir:
  11.  
  12. -Mostrar resultado del cifrado en hwndEdit2.
  13.  
  14. -Obtener numero de vueltas del cifrado Cesar en int. O hacer cast de string a int.
  15.  
  16. */
  17.  
  18.  
  19. /*
  20. Por anhadir
  21. Lista de comandos:
  22. -r Da la vuelta al texto.
  23. -f Guarda automaticamente la salida en un fichero y lo abre. El nombre es elegido en
  24. pantalla de bienvenida (Aun no implementada).
  25. */
  26.  
  27.  
  28. /*
  29. Lista de cifrados a incluir:
  30.  
  31. Cesar.
  32. string CifradoCesar(string Texto, int Vueltas);
  33.  
  34. Interseccion.
  35. string CifradoInterseccion(string Texto, int Vueltas, string Caracter);
  36.  
  37. etc.
  38. */
  39.  
  40.  
  41. #include <string>
  42. #include <iostream>
  43. #include <windows.h>
  44.  
  45.  
  46. using namespace std;
  47.  
  48. #define ID_EDIT 1
  49. #define ID_BUTTON 2
  50. #define ID_STATIC 3
  51.  
  52. std::string Texto_A_Cifrar = "";
  53. string Vueltas_A_Cifrar = "";
  54.  
  55. string CifradoCesar(string Texto, int Vueltas);
  56. string CifradoInterseccion(string Texto, int Vueltas, string Caracter); //Aun sin llamada
  57.  
  58. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  59.  
  60.  
  61.  
  62.  
  63. int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance,
  64. LPSTR lpCmdLine, int nCmdShow)
  65. {
  66.  
  67. MSG msg;
  68. WNDCLASSW wc = {0};
  69. wc.lpszClassName = L"Edit control";
  70. wc.hInstance = hInstance;
  71. wc.hbrBackground = GetSysColorBrush(COLOR_3DDKSHADOW);
  72. wc.lpfnWndProc = WndProc;
  73. wc.hCursor = LoadCursor(0, IDC_ARROW);
  74.  
  75. RegisterClassW(&wc);
  76. CreateWindowW(wc.lpszClassName, L"CIFRADO CESAR",
  77.  WS_OVERLAPPEDWINDOW | WS_VISIBLE,
  78.  250, 170, 430, 390, 0, 0 , hInstance, 0);
  79.  
  80. while (GetMessage(&msg, NULL, 0, 0))
  81. {
  82. TranslateMessage(&msg);
  83. DispatchMessage(&msg);
  84. }
  85.  
  86. return (int) msg.wParam;
  87.  
  88. }
  89.  
  90.  
  91. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  92. {
  93. static HWND hwndEdit;
  94. static HWND hwndEdit2;
  95. static HWND hwndEdit3;
  96. static HWND hwndEdit4;
  97. static HWND hwndButton;
  98. static HWND hwndStatic;
  99. static HWND hwndStatic2;
  100. static HWND hwndStatic3;
  101.  
  102.  
  103.  
  104. switch (msg)
  105. {
  106. case WM_CREATE:
  107. {
  108.    hwndStatic3 = CreateWindowW(L"Static", L"VUELTAS CIFRADO ---->", WS_CHILD | WS_VISIBLE,
  109. 11, 338, 154, 16, hwnd, (HMENU)ID_STATIC, NULL, NULL);
  110.  
  111. hwndEdit4 = CreateWindowW(L"Edit", L"", WS_CHILD | WS_VISIBLE | ES_NUMBER ,
  112. 167, 338, 154, 15, hwnd, (HMENU)ID_STATIC, NULL, NULL);
  113.  
  114.    hwndStatic2 = CreateWindowW(L"Static", L"CLAVE CIFRADO --------->", WS_CHILD | WS_VISIBLE,
  115. 11, 318, 154, 16, hwnd, (HMENU)ID_STATIC, NULL, NULL);
  116.  
  117. hwndEdit3 = CreateWindowW(L"Edit", L"", WS_CHILD | WS_VISIBLE |
  118.            ES_PASSWORD,
  119. 167, 318, 154, 15, hwnd, (HMENU)ID_STATIC, NULL, NULL);
  120.  
  121.    hwndEdit2 = CreateWindowW(L"Edit", L"Texto Cifrado.", WS_CHILD | WS_VISIBLE | WS_BORDER |
  122. ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL |ES_READONLY,
  123. 10, 154, 404, 160, hwnd, (HMENU)ID_EDIT, NULL, NULL);
  124.  
  125. hwndEdit = CreateWindowW(L"Edit", L"Escribe aqui tu texto a cifrar.", WS_CHILD | WS_VISIBLE | WS_BORDER |
  126.            ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL ,
  127. 10, 10, 404, 138, hwnd, (HMENU)ID_EDIT, NULL, NULL);
  128.  
  129. hwndButton = CreateWindowW(L"Button", L"ENTER", WS_VISIBLE | WS_CHILD,
  130. 333, 323, 80, 28, hwnd, (HMENU)ID_BUTTON, NULL, NULL);
  131.  
  132.            hwndStatic = CreateWindowW(L"Static", NULL, WS_VISIBLE | WS_CHILD,
  133. 11, 150, 402, 3, hwnd, (HMENU)ID_STATIC, NULL, NULL);
  134. } break;
  135.  
  136.  
  137. case WM_COMMAND:
  138. {
  139. if (HIWORD(wParam) == BN_CLICKED)
  140. {
  141. int VueltasEnInt = 0; //Vacia para siguientes llamadas.
  142. int len = GetWindowTextLengthW(hwndEdit) + 1; //Longitud de texto a cifrar + null terminator.
  143. wchar_t text[len]; //Array de chars unicode con la longitud del texto a cifrar.
  144.  
  145. GetWindowTextW(hwndEdit, text, len); //Obtener el texto en array.
  146. //No funciona.  GetWindowTextW(hwndEdit4, VueltasEnInt);//Obtener int.
  147.  
  148. Texto_A_Cifrar.clear(); //Vacia el string antes de ser usado.
  149.  
  150. for (int i = 0; i < len; ++i)
  151. {
  152. Texto_A_Cifrar += static_cast<char>(text[i]); //Llena el string con chars.
  153. }
  154.  
  155. /*
  156. IGNORAR, Esto es solo un ejemplo para que me acuerda de hacerlo.
  157.  
  158. Usar find para buscar comandos despues de un guion en el texto introducido.
  159. Guardar el comando en un char. Ejemplo:
  160. char ReverseStr = '0';
  161. char FileStr = '0';
  162. Siendo el texto a cifrar "-r-fTextoDeEjemplo" ReverseStr = 'r';
  163.  
  164. if (Reverse != '0')
  165. {
  166. Dar la vuelta a Texto_A_Cifrar;
  167. Guardar en Texto_A_Cifrar;
  168. }
  169.  
  170. if (File != '0')
  171. {
  172. Pedir nombre de archivo de texto;
  173. Guardar datos del cifrado en archivo de texto;
  174. }
  175.  
  176. etc.
  177. */
  178.  
  179. //Eliminar null terminator de string para cifrarlo:
  180. unsigned int TamanhoStr = Texto_A_Cifrar.length();
  181. string Texto_Cifrado = "";
  182. Texto_Cifrado.append(Texto_A_Cifrar, 0, TamanhoStr-1);
  183.  
  184.  
  185.  
  186. /*
  187. Intento de cast de cada char a int.
  188. No funciona porque suma los int.
  189. Por ejemplo si el usuario escribe en el editbox de vueltas:
  190. 152
  191. En vez de dar 152 vueltas al texto, se daran 1 + 5 + 2.
  192. 8 Vueltas. No se como solucionarlo.
  193.  
  194. for(auto iter = VueltasEnStr.begin(); iter != VueltasEnStr.end(); ++iter)
  195. {
  196. if (*iter > 48)
  197. {
  198.  
  199. cout << "Contenido iter:" << *iter << endl;
  200. VueltasEnInt += (static_cast<int>(*iter) -48) );
  201. cout << "Vuelta en int:" << VueltasEnInt << endl;
  202. }
  203.  
  204. }
  205. */
  206.  
  207.  
  208. //Aplicar cifrado Cesar. Falta obtener vueltas.
  209. //Asi sera la llamada: Texto_Cifrado = CifradoCesar(Texto_Cifrado,VueltasEnInt);
  210. Texto_Cifrado = CifradoCesar(Texto_Cifrado,VueltasEnInt); //LLamada de prueba:
  211. cout << Texto_Cifrado << endl; //Provisional para debug por consola
  212. cout << VueltasEnInt << endl; //Provisional para debug por consola
  213.  
  214.  
  215.  
  216. /*Sin implementar. Muestra el resultado en Ventana con hwndEdit2
  217. No se hacerlo. Se cambiarle el titulo a la ventana, pero no se cambiar
  218. el contenido del EDIT.
  219. Necesito cambiar L"Texto Cifrado." por el contenido de Texto_Cifrado*/
  220.  
  221. }
  222. } break;
  223.  
  224. case WM_DESTROY:
  225. {
  226. PostQuitMessage(0);
  227. break;
  228. }
  229. }
  230. return DefWindowProcW(hwnd, msg, wParam, lParam);
  231. }
  232.  
  233. //Cesar
  234. string CifradoCesar(string Texto, int vueltas)
  235. {
  236. string TextoSalida = "";
  237. for(auto iter = Texto.begin(); iter != Texto.end(); ++iter)
  238. {
  239. TextoSalida += (*iter + vueltas);
  240. }
  241. return TextoSalida;
  242. }
  243.  
  244.  
  245. //Interseccion
  246. string CifradoInterseccion(string Texto, int Vueltas, string Caracter)
  247. {
  248.  
  249. string Texto2;
  250.  
  251. for (int i = 0; i < Texto.size(); ++i)
  252. {
  253.  
  254. Texto2 += Texto[i];
  255.  
  256. for (int i = 0; i < Vueltas; ++i)
  257. {
  258. Texto2.append(Caracter);
  259. }
  260. }
  261.  
  262. return Texto2;
  263. }
  264.  
155  Programación / Programación C/C++ / En que cabecera encuentro los #define ID_EJEMPLO de Windows.h? en: 12 Junio 2019, 05:19 am
Es para ver el listado de todas las opciones posibles e ir probándolas. En el codeblocks no me salen.
En visual studio me imagino que los nombres de las cabeceras serán parecidos. A ver si alguien me puede mirar o sabe donde los puedo encontrar. Estoy mirando en Codeblocks\MinGW\Include

Encontré un ejemplo por google y lo estoy modificando para hacer mi programa mientras aprendo.
Para hacer la gui a mi gusto más o menos le he dado la forma que me gustaría a cada ventana. Le añadi 2 edit box y las hice multilinea y que el enter salte de linea usando las flags correspondientes. Despues puse 2 botones. Uno para enviar texto y otro para separar los 2 editbox. En el ejemplo venian las macros  de los ID_BUTTON e ID_EDIT definidos en el propio programa.

Ahora mismo lo que quiero hacer es substituir un EDIT por un control que muestre texto plano para mostrar el resultado del cifrado. Estoy usando provisionalmente otro EDIT mientras no encuentro los #define ID_LOQUESEA 111 para poder saber todas las opciones disponibles y elegir la que me convezca y la correcta para ello.
El mismo problema tengo con el boton que puse en el centro para hacer un separador entre los EDIT box para que quedase mejor. Si pudiese mirar los define buscaría algun borde adecuado para ello.

Después solo me faltaría buscar como obtener el input en un string para aplicarle el cifrado. Y como mostrar el string en el control adecuado. Esto aún no lo miré porque estoy intentando hacer lo anterior de substituir el boton y el editbox por un borde y un texto estatico o algo así.

Aquí dejo el código por si quereis compilarlo y ver la ventana para entender mejor lo que intento explicar.

Sé que no estoy usando los handlers correctamente para los botones y los edit box, de momento ni lo cambie. Lo puse de cualquier manera para ir probando y moldeando la ventana sin distraerme con otras cosas. Cuando acabe el programa repasare el código línea por línea dejándolo mejor formateado comentado, etc.

Código
  1. /*
  2. Code::Blocs 17.12
  3. Other Linker Settings:
  4. -lmingw32 -mwindows
  5. */
  6.  
  7. #include <windows.h>
  8.  
  9. #define ID_EDIT 1
  10. #define ID_BUTTON 2
  11.  
  12. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  13.  
  14. int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance,
  15. LPSTR lpCmdLine, int nCmdShow)
  16. {
  17.  
  18. MSG msg;
  19. WNDCLASSW wc = {0};
  20. wc.lpszClassName = L"Edit control";
  21. wc.hInstance = hInstance;
  22. wc.hbrBackground = GetSysColorBrush(COLOR_3DDKSHADOW);
  23. wc.lpfnWndProc = WndProc;
  24. wc.hCursor = LoadCursor(0, IDC_ARROW);
  25.  
  26. RegisterClassW(&wc);
  27. CreateWindowW(wc.lpszClassName, L"CIFRADO CESAR ASCII",
  28.  WS_OVERLAPPEDWINDOW | WS_VISIBLE,
  29.  250, 170, 430, 380, 0, 0 , hInstance, 0);
  30.  
  31. while (GetMessage(&msg, NULL, 0, 0))
  32. {
  33. TranslateMessage(&msg);
  34. DispatchMessage(&msg);
  35. }
  36.  
  37. return (int) msg.wParam;
  38.  
  39. }
  40.  
  41.  
  42. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  43. {
  44. static HWND hwndEdit;
  45. HWND hwndButton;
  46. HWND hwndButton2;
  47.  
  48. switch (msg)
  49. {
  50. case WM_CREATE:
  51. {
  52.    hwndEdit = CreateWindowW(L"Edit", L"Texto Cifrado.", WS_CHILD | WS_VISIBLE | WS_BORDER |
  53. ES_MULTILINE | ES_WANTRETURN,
  54. 10, 154, 404, 160, hwnd, (HMENU)ID_EDIT, NULL, NULL);
  55.  
  56. hwndEdit = CreateWindowW(L"Edit", L"Escribe aqui tu texto a cifrar.", WS_CHILD | WS_VISIBLE | WS_BORDER |
  57.            ES_MULTILINE | ES_WANTRETURN,
  58. 10, 10, 404, 138, hwnd, (HMENU)ID_EDIT, NULL, NULL);
  59.  
  60. hwndButton = CreateWindowW(L"button", L"ENTER", WS_VISIBLE | WS_CHILD,
  61. 335, 320, 80, 25, hwnd, (HMENU)ID_BUTTON, NULL, NULL);
  62.  
  63.            hwndButton2 = CreateWindowW(L"button", NULL, WS_VISIBLE | WS_CHILD,
  64. 11, 150, 403, 3, hwnd, (HMENU)ID_BUTTON, NULL, NULL);
  65. } break;
  66.  
  67.  
  68. case WM_COMMAND:
  69. {
  70. if (HIWORD(wParam) == BN_CLICKED)
  71. {
  72. int len = GetWindowTextLengthW(hwndEdit) + 1;
  73. wchar_t text[len];
  74.  
  75. GetWindowTextW(hwndEdit, text, len);
  76. SetWindowTextW(hwnd, text);
  77. }
  78. } break;
  79.  
  80. case WM_DESTROY:
  81. {
  82. PostQuitMessage(0);
  83. break;
  84. }
  85. }
  86. return DefWindowProcW(hwnd, msg, wParam, lParam);
  87. }
156  Programación / Programación C/C++ / Ayuda creando input box y obteniendo input en un string. Windows Api. en: 11 Junio 2019, 07:15 am
Probe de bastantes formas y no lo consigo ni encuentro ejemplos. La ventana textbox va a ser hija de otra ventana. De momento la puse así para ver si la conseguí hacer funcionar pero no hay manera. El programa compila. Asique si no te compila puede que yo tenga algún fallo al escribir el código, porque lo acabo de copiar a mano con el móvil mirando por lo que tengo hecho en el pc.
Lo que quiero es que la ventana me permita escribirle dentro texto. Despues le pondré un boton para enviar el texto. Lo he intentado así pero no funciona. Despues quiero obtener el input del usuario y guardarlo en un string para trabajar con él. De momento tengo esto:

Código
  1. #include <windows.h>
  2.  
  3. const char NombreDeClase[] = "LaClaseDeMiVentana";
  4.  
  5. LRESULT CALLBACK Ventana(HWND hVentana, UINT mensajeVentana, WPARAM wParam, LPARAM lParam)
  6. {
  7.   switch (mensajeVentana)
  8.   {
  9.         case WM_LBUTTONDOWN:
  10.         {
  11.          \\Me gustaria poder escribir en la ventana. No sé como.
  12.         } break;
  13.  
  14.         case WM_CLOSE:
  15.         {
  16.         DestroyWindow(hVentana);
  17.         } break;
  18.  
  19.        case WM_DESTROY:
  20.        {
  21.         PostQuitMessage(0);
  22.        } break;
  23.  
  24.        default:
  25.        {
  26.        return DefWindowProc(hVentana, mensajeVentana, wParam, lParam);
  27.        } break;
  28.   }
  29. return 0;
  30. }
  31.  
  32. int WINAPI WinMain(HINSTANCE h_instancia, HINSTANCE h_sinUso, LPSTR p_cmd, int n_CmdShow)
  33. {
  34. WNDCLASSEX ClaseVentana;
  35. HWND hVentana;
  36. MSG MensajeVentana;
  37.  
  38. ClaseVentana.cbSize = sizeof(WNDCLASSEX);
  39. ClaseVentana.style = 0;
  40. ClaseVentana.lpfnWndProc = Ventana;
  41. ClaseVentana.cbClsExtra= 0;
  42. ClaseVentana.cbWndExtra = 0;
  43. ClaseVentana.hInstance = h_instancia;
  44. ClaseVentana.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  45. ClaseVentana.hCursor = LoadCursor(NULL, IDC_ARROW);
  46. ClaseVentana.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
  47. ClaseVentana.lpszMenuName = NULL;
  48. ClaseVentana.lpszClassName = NombreDeClase;
  49. ClaseVentana.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
  50.  
  51.   if ( !RegisterClassEx(&ClaseVentana) )
  52.   {
  53.   MessageBox(NULL, "Error Al Registrar \"ClaseVentana\"", "ERROR", MB_ICONEXCLAMATION | MB_OK);
  54.   return 0;
  55.   }
  56.  
  57. char* linea;
  58.  
  59. hVentana = CreateWindowEx(
  60. WS_EX_CLIENTEDGE,
  61. NombreDeClase,
  62. "Titulo textbox",
  63. WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_LEFT,
  64. CW_USEDEFAULT, CW_USEDEFAULT, 200, 48,
  65. NULL. NULL. h_instancia, NULL);
  66.  
  67. char szInput[MAX_PATH];
  68.  
  69. GetDlgItemText(hVentana,123, linea, 100);
  70. GetWindowText(GetDlgItem(hVentana, 101), szInput, MAX_PATH);
  71.  
  72.  if (hVentana == NULL)
  73.   {
  74.   MessageBox(NULL, "Error Al Crear La Ventana", "ERROR", MB_ICONEXCLAMATION | MB_OK);
  75.   return 0;
  76.   }
  77.  
  78. ShowWindow(hVentana, n_CmdShow),
  79. UpdateWindow(hVentana);
  80.  
  81.   while ( GetMessage(&MensajeVentana, NULL, 0, 0) > 0 )
  82.   {
  83.    TranslateMessage(&MensajeVentana);
  84.    DispatchMessage(&MensajeVentana);
  85.    }
  86.  
  87. return MensajeVentana.wParam;
  88. }
157  Programación / Programación C/C++ / Manejo de strings enormes y caracteres? en: 10 Junio 2019, 22:59 pm
Estoy haciendo un cifrado Cesar. El descifrado muestra las 255 posibles opciones del texto y lo guarda en el string.

En la funcion despues de crear el string en el que guardare el texto uso nombredelstring.reserve(1000000);
Para tener espacio en el string.

Despues de guardar todo en el string uso
nombredelstring.shrink_to_fit();
Para ajustar el tamaño del string a sus necesidades reales.

El problema lo tengo despues de la llamada a la funcion en main cuando intento tomar datos por entrada con cin. Se me salta varios cin y no deja al usuario del programa introducir los valores.

El programa es muy sencillo. Lo pondre resumido.
Código
  1. string Funcion(string texto)
  2. {
  3. string textosalida;
  4.   for (int vueltas =1; vueltas <256; ++vueltas)
  5.   {
  6.    textosalida += "\nDespues de este mensaje ves la opcion ";
  7.         for (auto iter = texto.begin(); iter != texto.end(); ++iter)
  8.         {
  9.          textosalida += (*iter + vueltas);
  10.         }
  11.    }
  12. return textosalida;
  13. }
  14.  
  15. int main()
  16. {
  17. string blabla;
  18. cout <<"bla bla";
  19. getline(cin, blabla);
  20.  
  21. string texto = Funcion(blabla);
  22. cout << texto;
  23.  
  24. int guardar =4;
  25. //Aqui el problema:
  26. cout << endl << endl << "pulsa 1 para bla bla bla" <<endl;
  27. cin >> guardar;
  28. //Se salta el cin anterior y entra en el siguiente if sin razon logica aparente.
  29.  
  30. if (guardar ==1)
  31. {
  32. cout << "Guardando en documento, pon el titulo" <<endl;
  33. //getline...
  34. }
  35.  
  36. cin.get()
  37. return 0;
  38. }
  39.  
Suponí que era un error del buffer. Asique probe con cin.ignore(); Pero debe ser algun fallo de memoria o algo que no sé como solucionar.

En el ejemplo de meterle abc como texto a la funcion guarda lo siguiente en el string:
Despues de este mensaje ves la opcion abc
Despues de este mensaje ves la opcion bcd
Despues de este mensaje ves la opcion cde
...
Despues de este mensaje ves la opcion abc

Da 256 vueltas para mostrar todas las opciones posibles del texto cifrado para que ek usuario las mire y descubra cual era el texto original.
Por lo que el string puede ser enorme ya que va a multiplicar por 256 cualquier texto que introduzca el usuario.

A qué se debe el fallo?
Debería usar vectores de strings? O se puede hacer con un string?

Si necesitais el código completo, lo paso, pero poco más que eso es.

Como la salida es muy grande queria ponerle opcion para escribir en un documento de texto la salida y abrir el documento desde el programa para poder ver todas las posibilidades.
158  Programación / Programación C/C++ / Recomendación documentacion WinApi en: 10 Junio 2019, 02:09 am
Me gustaría que me recomendasen algún libro, curso, o web con ejemplos prácticos.

Actualmente estoy siguiendo:
- http://winapi.conclase.net/curso/index.php
- Version 2.0 of theForger's win32 Api tutorial.
- Introduccion a la programacion para windows con visual C++ Universidad de oviedo 2005
- Windows programming en.wikibooks.org
- Programaccion C++ en ambiente windows.

Todo lo que pruebo me funciona, pero al ser toda la documentación de hace muchísimos años no sé si abrá otra documentación más aconsejable. Otras formas más modernas de hacer las cosas etc. Uso codeblocks.
Muchas gracias.
159  Programación / Programación C/C++ / Aporte. Funcion para poner pantalla de título a programa por consola. en: 9 Junio 2019, 05:45 am
Siempre ando a hacerlo a mano y hecho mi tiempo asique hice una función sencilla que lo haga por mi.
Las abrá 100 veces mejores, sin fallos y más completas por ahí. Yo os dejo la mía para quien la quiera usar, o por si os apetece discutir sobre el código, como lo haceis vosotros, como mejorarlo, etc.

Hay 2 bucles for que tienen los numeros 25 y 80. Son la altura y la anchura por defecto que yo tengo en mi consola.Podeis cambiarlos por int ancho e int alto.
Si vais a aumentarla, abrir el programa con la consola máximizada, etc. Le poneis lo que corresponda, vais probabdo. Al hacer eso también abrá que cambiar el (j==79) por (j==nuevoAncho-1) y el (contador == 24) por (contador == nuevaAltura-1)
Se puede hacer con menos variables, sin llenar tantos strings y creo que hay variables sin usar en la segunda funcion. Si quereis optimizarlo genial.

Abajo de todo del código dibujé las salidas del programa por consola de cada función por si quereis ver exactamente lo que hacen antes de compilar el código.
También dejé un ejemplo creado en el main para verlo al compilar.

Código
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. string crearIntro(string escenariochar, string bordes, string bordesArriba, string bordesAbajo );
  7. string anhadirTexto(string cadenaDelUsuario, string texto, int linea);
  8.  
  9.  
  10. int main()
  11. {
  12. string mistring;
  13.  
  14. mistring = crearIntro("1", "|", "=", "_");
  15. //cout << mistring; //Ejemplo de lo que hace.
  16.  
  17. mistring = crearIntro(" ", "|", "=", "_");
  18. //cout << endl << mistring; //Ejemplo practico de funcion CrearIntro
  19.  
  20. mistring = anhadirTexto(mistring, "MI PROGRAMA DE CONSOLA!", 12);
  21. //cout << endl << mistring; //Ejemplo practico de anhadirTexto
  22.  
  23. string textoDeMiprograma = "Pulsa enter para empezar.                                               ";
  24. mistring = anhadirTexto(mistring,textoDeMiprograma , 23);
  25. textoDeMiprograma = "                                                           Sunday,June 09,2019";
  26. mistring = anhadirTexto(mistring,textoDeMiprograma , 2);
  27.  
  28. cout << endl << mistring; //Ejemplo practico de anhadirTexto
  29.  
  30. cin.get();
  31. return 0;
  32. }
  33.  
  34.  
  35. string crearIntro(string escenariochar, string bordes, string bordesArriba, string bordesAbajo)
  36. {
  37. string escenario;
  38. static int contador = 0;
  39.  
  40. for ( int i = 0; i < 25; ++i )
  41. {
  42.        for ( int j = 0; j < 80; ++j )
  43.        {
  44.            if(j == 79 || j == 0)
  45.            {
  46. if(contador == 0 || contador == 1 || contador == 24)
  47.                {
  48. if (contador == 0 || contador == 1)
  49. {
  50. escenario.append(bordesArriba);
  51. }
  52.  
  53. else
  54. {
  55. escenario.append(bordesAbajo);
  56. }
  57.                }
  58.  
  59. else
  60. {
  61. escenario.append(bordes);
  62. }
  63. }
  64.  
  65.            else
  66.            {
  67.                if(contador == 0 || contador == 1 || contador == 24)
  68.                {
  69. if (contador == 0 || contador == 1)
  70. {
  71. escenario.append(bordesArriba);
  72. }
  73.  
  74. else
  75. {
  76. escenario.append(bordesAbajo);
  77. }
  78.  
  79. }
  80.  
  81. else
  82. {
  83. escenario.append(escenariochar);
  84. }
  85. }
  86.        }
  87.    ++contador;
  88. }
  89.  
  90. contador = 0;
  91. return escenario;
  92. }
  93.  
  94.  
  95. string anhadirTexto(string cadenaDelUsuario, string texto, int linea)
  96. {
  97. int tamanhocadena = cadenaDelUsuario.size();
  98. int tamanhotexto = texto.size();
  99. int mitadtamanhotexto = tamanhotexto/2;
  100. int saltosDeLinea = linea;
  101. string nuevaCadena = cadenaDelUsuario;
  102. int diferenciaTexto;
  103. int x = 80;
  104. string vacio;
  105.  
  106. diferenciaTexto = x * linea;
  107. diferenciaTexto -= -(40 - mitadtamanhotexto);
  108.  
  109. vacio.append(cadenaDelUsuario, 0, diferenciaTexto);
  110. vacio.append(texto);
  111. diferenciaTexto += tamanhotexto;
  112. vacio.append(cadenaDelUsuario, diferenciaTexto, 2000);
  113.  
  114. return vacio;
  115. }
  116.  
  117.  
  118. /*
  119. Ejemplo de llamada a crearIntro:
  120.  
  121. string mistring;
  122. mistring = crearIntro("1", "|", "=", "_");
  123.  
  124. Primer parametro -> Llena la consola del caracter que le pongamos.
  125. Segundo parametro -> Utiliza el caracter como borde.
  126. Tercer parametro -> Utiliza el caracter como borde superior.
  127. Cuarto parametro -> Utiliza el caracter como borde inferior.
  128.  
  129. En la llamada de arriba el resultado sera asi:
  130.  
  131. ==================
  132. ==================
  133. |1111111111111111|
  134. |1111111111111111|
  135. |1111111111111111|
  136. |1111111111111111|
  137. |1111111111111111|
  138. |1111111111111111|
  139. |1111111111111111|
  140. |1111111111111111|
  141. |1111111111111111|
  142. __________________
  143.  
  144.  
  145. */
  146.  
  147. /*
  148. Ejemplo de llamada a anhadirTexto:
  149.  
  150. string mistring;
  151. mistring = anhadirTexto(mistring, "HOLA!", 6);
  152.  
  153. Primer parametro -> El string que tenemos de la otra funcion.
  154. Segundo parametro -> El texto que queremos anhadir.
  155. Tercer parametro -> La linea en la cual queremos poner nuestro texto.
  156.  
  157.  
  158. En este ejemplo cambiamos el "1" por un espacio " " o un espacio "\ ".
  159.  
  160. string mistring;
  161. mistring = crearIntro(" ", "x", "A", "*");
  162. mistring = anhadirTexto(mistring, "MI PROGRAMA!", 5);
  163.  
  164. En la llamada el resultado sera asi:
  165.  
  166. AAAAAAAAAAAAAAAAAA     Linea 1
  167. AAAAAAAAAAAAAAAAAA     Linea 2
  168. x                x     Linea 3
  169. x                x     Linea 4
  170. x  MI PROGRAMA!  x     Linea 5
  171. x                x     Linea 6
  172. x                x     Linea 7
  173. x                x     Linea 8
  174. x                x     Linea 9
  175. x                x     Linea 10
  176. x                x     Linea 11
  177. ******************     Linea 12
  178.  
  179. */
160  Programación / Programación C/C++ / Como detecto el tipo de dato introducido en la llamada de una funcion? en: 8 Junio 2019, 23:40 pm
Como puedo implementar en la funcion una distincion para saber si en la llamada a la funcion en main he puesto el int 97 o el char 'a' para que la funcion me saque por pantalla el numero 97 o la letra a?

Tal y como lo tengo, le puse un static_cast para sacar la letra a.
Pero quiero que si se busca el numero 97, me salga por pantalla el numero 97 no la letra a.
Como hago esta distincion para saber si en la llamada se está buscando la letra a o el numero 97?

Tal y como está ahora, si busco el numero 97 me dirá que ha encontrado la letra a.
Cuando yo lo que quiero es buscar si el numero 97 está en el array. Y si le quito el cast pues tendré el mismo problema al reves, buscaré la letra a, y me dirá que encontró el numero 97.

Código
  1. #include <iostream>
  2. #include <array>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6. using MiArray = std::array<int, 10>;
  7.  
  8. MiArray primerArray = {0,1,2,3,4,5,'a',6,7,8};
  9.  
  10. void BuscarEnElArray(MiArray miArray, auto CosaAbuscar);
  11.  
  12. int main()
  13. {
  14.   BuscarEnElArray(primerArray, 'a');
  15.   cin.get();
  16.  
  17. return 0;
  18. }
  19.  
  20.  
  21. void BuscarEnElArray(MiArray miArray, auto CosaAbuscar)
  22. {
  23.   MiArray::iterator found = find(miArray.begin(), miArray.end(), CosaAbuscar);
  24.   if ( found != miArray.end() )
  25.   {
  26.        cout << "Encontrado: " << static_cast<char>(*found) <<endl;
  27.   }
  28. }

Me gustaría que fuese con un solo array para no tener que crear un array para cada tipo de dato distinto.
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [16] 17 18 19
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines