Mensaje scroll

Iniciado por 85, 31 Marzo 2013, 14:03 PM

0 Miembros y 1 Visitante están viendo este tema.

85

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 (cpp) [Seleccionar]


//
// By 85
// Credits: LTFX
// elhacker.net
// etalking.com.ar
// boyscout_arg@hotmail.com
// 2013
//

////////////////////////////////////////////////////////////////////////////////////////////////

#include<windows.h>
#include<stdio.h>
#include<stdlib.h>

////////////////////////////////////////////////////////////////////////////////////////////////

#define MAX_MESSAGES 13
#define STRINGSIZE 0x40
#define INTERVAL 500
bool activar=false;
char* resetMessage = "setinfo \"xxxxx\" \"\"";
char* blankMessage = "setinfo \"xxxxx\" \"%s\"";
//allow up to 13 messages
char gHudMessage5[MAX_MESSAGES][256] = { "","","","","","","","","","","","","" };
// a "hack" way to scroll list without copying strings
int indexRedirect[MAX_MESSAGES] = { 0,1,2,3,4,5,6,7,8,9,10,11,12 };

HANDLE hThread;

////////////////////////////////////////////////////////////////////////////////////////////////

void gSetHudMessage5(const char* message)
{
int dest = indexRedirect[0];
indexRedirect[0] = indexRedirect[1];
indexRedirect[1] = indexRedirect[2];
indexRedirect[2] = indexRedirect[3];
indexRedirect[3] = indexRedirect[4];
indexRedirect[4] = indexRedirect[5];
indexRedirect[5] = indexRedirect[6];
indexRedirect[6] = indexRedirect[7];
indexRedirect[7] = indexRedirect[8];
indexRedirect[8] = indexRedirect[9];
indexRedirect[9] = indexRedirect[10];
indexRedirect[10] = indexRedirect[11];
indexRedirect[11] = indexRedirect[12];
indexRedirect[12] = dest;
strcpy(gHudMessage5[dest],message);
}

////////////////////////////////////////////////////////////////////////////////////////////////

void Thread(const char* value){

DWORD* ptrValue = (DWORD*)value;
DWORD OFFS = 0x0;//0x00000000;
DWORD BLOCK = ((ptrValue+(STRINGSIZE*(MAX_MESSAGES-1)))-ptrValue);
//sizeof(messagelist);

while(1){
system("cls");
SYSTEMTIME SysTime;
GetLocalTime(&SysTime);
char* formatstring   =   (SysTime.wMinute<10) ?  "%d:0%d\n" :  "%d:%d\n";
printf(formatstring, SysTime.wHour, SysTime.wMinute);
printf("Presione 1 para activar/desactivar el scroll! (Salir=2)\n");

if(GetAsyncKeyState(0x31)>0) {

activar=!activar;
}

if(activar)
{
char* val = (char*)(ptrValue+(OFFS/sizeof(DWORD)));
if(val && val[0]!=0)
{
char message[STRINGSIZE];
message[0] = 0;// Antes de usar strcat!
strcat( message , "Elhacker.net" );
strcat( message , ": " );
strcat( message , val );
strcat( message , "\n" );
gSetHudMessage5(message);

printf("\nHooK MSN v 1.0\n");
for(int i=0; i<MAX_MESSAGES; i++){
printf(gHudMessage5[indexRedirect[i]]);
}

if(OFFS==BLOCK)
{
OFFS=0x0;//0x00000000;
}
else
{
OFFS+=STRINGSIZE;//0x00000040;
}
}
}

if(GetAsyncKeyState(0x32)>0){

ExitProcess(0);
//ResumeThread(hThread);// Can't from this thread
//break;
}

Sleep(INTERVAL);
}
}

////////////////////////////////////////////////////////////////////////////////////////////////

int main(){

char messagelist[MAX_MESSAGES][STRINGSIZE];
strcpy(messagelist[0],"Hola");
strcpy(messagelist[1],"Mi");
strcpy(messagelist[2],"Nombre");
strcpy(messagelist[3],"Es");
strcpy(messagelist[4],"David");
strcpy(messagelist[5],"Y");
strcpy(messagelist[6],"Esto");
strcpy(messagelist[7],"Es");
strcpy(messagelist[8],"Un");
strcpy(messagelist[9],"Mensaje");
strcpy(messagelist[10],"Scroll");
strcpy(messagelist[11],"XD");
strcpy(messagelist[12],"XD");
char* value = (char*)&messagelist;

// Determinar el tamaño del bloque restando final con inicio
// DWORD add1 = (DWORD)&messagelist[0];
// DWORD add2 = (DWORD)&messagelist[12];
// DWORD diff = (DWORD)(add2-add1);
// printf("%X\n",diff);
// system("pause");

DWORD tID;
//tID = GetCurrentThreadId();
CreateThread(0,1<<24,(unsigned long (__stdcall *)(void *))Thread,value,0,&tID);
//printf("tID: %d\n",tID);

//hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, GetCurrentThreadId());
//Returns a "pseudo handle" that can only be used from the calling thread.
hThread = GetCurrentThread();
SuspendThread(hThread);
//ResumeThread(hThread);

system("pause");
return (0);
}





Esta era su aplicación original


PROJECT:
http://www.mediafire.com/?q6dq36cdd9hxvxb
Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/