Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 85 en 31 Marzo 2013, 14:03 pm



Título: Mensaje scroll
Publicado por: 85 en 31 Marzo 2013, 14:03 pm
Hola, estaba probando un código para mensaje scroll, me pareció buena la idea de postearlo. Ya lo había usado mucho antes pero no para un programa de consola.

El programa va a mostrar todas las cadenas que hay en un array de cadenas o matríz de caracteres, son 13 cadenas en total, pero originalmente lo usaba con 4.
La modificación que le hice fue la necesidad de crear un hilo aparte para mostrar las cadenas en scroll, y suspender el hilo principal.

El hilo principal nunca se resume y para salir del programa se sale con ExitProcess desde el hilo secundario.

El intervalo de tiempo entre las cadenas se hace con 'Sleep'.

Como ustedes ya saben, cuando se crea un hilo con CreateThread se le debe pasar un argumento que es la rutina con la cual empieza a ejecutarse el hilo. Esta rutina lleva un parámetro, que lo recibe al crearse el hilo porque dicho parámetro se pasa a CreateThread como argumento.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453(v=vs.85).aspx

El tamaño del vector de cadenas se puede sacar con sizeof, pero en este caso se hace restando las direcciones de memoria del último elemento menos el primero.

Para iniciar el 'scrolling' se presiona 1,  y para salir del programa se presiona 2.

Aclarado todo eso, muestro el código
Código
  1.  
  2. //
  3. // By 85
  4. // Credits: LTFX
  5. // elhacker.net
  6. // etalking.com.ar
  7. // boyscout_arg@hotmail.com
  8. // 2013
  9. //
  10.  
  11. ////////////////////////////////////////////////////////////////////////////////////////////////
  12.  
  13. #include<windows.h>
  14. #include<stdio.h>
  15. #include<stdlib.h>
  16.  
  17. ////////////////////////////////////////////////////////////////////////////////////////////////
  18.  
  19. #define MAX_MESSAGES 13
  20. #define STRINGSIZE 0x40
  21. #define INTERVAL 500
  22. bool activar=false;
  23. char* resetMessage = "setinfo \"xxxxx\" \"\"";
  24. char* blankMessage = "setinfo \"xxxxx\" \"%s\"";
  25. //allow up to 13 messages
  26. char gHudMessage5[MAX_MESSAGES][256] = { "","","","","","","","","","","","","" };
  27. // a "hack" way to scroll list without copying strings
  28. int indexRedirect[MAX_MESSAGES] = { 0,1,2,3,4,5,6,7,8,9,10,11,12 };
  29.  
  30. HANDLE hThread;
  31.  
  32. ////////////////////////////////////////////////////////////////////////////////////////////////
  33.  
  34. void gSetHudMessage5(const char* message)
  35. {
  36. int dest = indexRedirect[0];
  37. indexRedirect[0] = indexRedirect[1];
  38. indexRedirect[1] = indexRedirect[2];
  39. indexRedirect[2] = indexRedirect[3];
  40. indexRedirect[3] = indexRedirect[4];
  41. indexRedirect[4] = indexRedirect[5];
  42. indexRedirect[5] = indexRedirect[6];
  43. indexRedirect[6] = indexRedirect[7];
  44. indexRedirect[7] = indexRedirect[8];
  45. indexRedirect[8] = indexRedirect[9];
  46. indexRedirect[9] = indexRedirect[10];
  47. indexRedirect[10] = indexRedirect[11];
  48. indexRedirect[11] = indexRedirect[12];
  49. indexRedirect[12] = dest;
  50. strcpy(gHudMessage5[dest],message);
  51. }
  52.  
  53. ////////////////////////////////////////////////////////////////////////////////////////////////
  54.  
  55. void Thread(const char* value){
  56.  
  57. DWORD* ptrValue = (DWORD*)value;
  58. DWORD OFFS = 0x0;//0x00000000;
  59. DWORD BLOCK = ((ptrValue+(STRINGSIZE*(MAX_MESSAGES-1)))-ptrValue);
  60. //sizeof(messagelist);
  61.  
  62. while(1){
  63. system("cls");
  64. SYSTEMTIME SysTime;
  65. GetLocalTime(&SysTime);
  66. char* formatstring   =   (SysTime.wMinute<10) ?  "%d:0%d\n" :  "%d:%d\n";
  67. printf(formatstring, SysTime.wHour, SysTime.wMinute);
  68. printf("Presione 1 para activar/desactivar el scroll! (Salir=2)\n");
  69.  
  70. if(GetAsyncKeyState(0x31)>0) {
  71.  
  72. activar=!activar;
  73. }
  74.  
  75. if(activar)
  76. {
  77. char* val = (char*)(ptrValue+(OFFS/sizeof(DWORD)));
  78. if(val && val[0]!=0)
  79. {
  80. char message[STRINGSIZE];
  81. message[0] = 0;// Antes de usar strcat!
  82. strcat( message , "Elhacker.net" );
  83. strcat( message , ": " );
  84. strcat( message , val );
  85. strcat( message , "\n" );
  86. gSetHudMessage5(message);
  87.  
  88. printf("\nHooK MSN v 1.0\n");
  89. for(int i=0; i<MAX_MESSAGES; i++){
  90. printf(gHudMessage5[indexRedirect[i]]);
  91. }
  92.  
  93. if(OFFS==BLOCK)
  94. {
  95. OFFS=0x0;//0x00000000;
  96. }
  97. else
  98. {
  99. OFFS+=STRINGSIZE;//0x00000040;
  100. }
  101. }
  102. }
  103.  
  104. if(GetAsyncKeyState(0x32)>0){
  105.  
  106. ExitProcess(0);
  107. //ResumeThread(hThread);// Can't from this thread
  108. //break;
  109. }
  110.  
  111. Sleep(INTERVAL);
  112. }
  113. }
  114.  
  115. ////////////////////////////////////////////////////////////////////////////////////////////////
  116.  
  117. int main(){
  118.  
  119. char messagelist[MAX_MESSAGES][STRINGSIZE];
  120. strcpy(messagelist[0],"Hola");
  121. strcpy(messagelist[1],"Mi");
  122. strcpy(messagelist[2],"Nombre");
  123. strcpy(messagelist[3],"Es");
  124. strcpy(messagelist[4],"David");
  125. strcpy(messagelist[5],"Y");
  126. strcpy(messagelist[6],"Esto");
  127. strcpy(messagelist[7],"Es");
  128. strcpy(messagelist[8],"Un");
  129. strcpy(messagelist[9],"Mensaje");
  130. strcpy(messagelist[10],"Scroll");
  131. strcpy(messagelist[11],"XD");
  132. strcpy(messagelist[12],"XD");
  133. char* value = (char*)&messagelist;
  134.  
  135. // Determinar el tamaño del bloque restando final con inicio
  136. // DWORD add1 = (DWORD)&messagelist[0];
  137. // DWORD add2 = (DWORD)&messagelist[12];
  138. // DWORD diff = (DWORD)(add2-add1);
  139. // printf("%X\n",diff);
  140. // system("pause");
  141.  
  142. DWORD tID;
  143. //tID = GetCurrentThreadId();
  144. CreateThread(0,1<<24,(unsigned long (__stdcall *)(void *))Thread,value,0,&tID);
  145. //printf("tID: %d\n",tID);
  146.  
  147. //hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, GetCurrentThreadId());
  148. //Returns a "pseudo handle" that can only be used from the calling thread.
  149. hThread = GetCurrentThread();
  150. SuspendThread(hThread);
  151. //ResumeThread(hThread);
  152.  
  153. system("pause");
  154. return (0);
  155. }
  156.  
  157.  

(http://img542.imageshack.us/img542/1838/scroll1.png) (http://imageshack.us/photo/my-images/542/scroll1.png/)

Esta era su aplicación original
(http://img33.imageshack.us/img33/6139/dedust20002ch.png) (http://imageshack.us/photo/my-images/33/dedust20002ch.png/)

PROJECT:
http://www.mediafire.com/?q6dq36cdd9hxvxb