Cojer texto de un control edit API (MASM)

Iniciado por Riki_89D, 31 Diciembre 2009, 18:41 PM

0 Miembros y 2 Visitantes están viendo este tema.

Riki_89D

Hola k tal?

como cojo el texto de un control edit con la API? trabajo en MAMS (Ensablador)

intente con esto:

invoke SendMessage,handle,WM_GETTEXT,offset Buffer,0

y nada i aisn tambin probe:

invoke GetWindowText,handle,offset Buffer,0


y nada :( por que pasa no me sale nada por que??


este es el codde k llevo en mano:



WndProc proc han:HWND,msg2:UINT,wParam:WPARAM,lParam:LPARAM

.IF msg2 == WM_DESTROY
invoke PostQuitMessage,0
.ELSEIF msg2 == WM_CREATE

invoke CreateWindowEx,NULL,offset Control1,NULL,\
WS_CHILD or WS_VISIBLE or WS_BORDER or ES_MULTILINE,\
100,100,100,100,han,0,NULL,NULL


invoke CreateWindowEx,NULL,offset Control2,offset TxtBot,\
WS_CHILD or BS_DEFPUSHBUTTON or WS_VISIBLE,\
100,30,100,40,han,IDM_BOT,NULL,NULL


.ELSEIF msg2 == WM_COMMAND
.IF wParam == IDM_BOT



PUSH 0
PUSH 0
PUSH offset Buffer
PUSH han
CALL [MessageBox]
.ENDIF

.ELSE

invoke DefWindowProc,han,msg2,wParam,lParam
RET
.ENDIF
xor eax,eax
ret

WndProc endp

end start




y aprovecho por preguntar algo que no tieen naa que ver con esto (asin ahorro un post nuevo)

e estado mirando una web donde enseñan a hacer el hola mundo con ensamblador de 32 bits desde el arranque de la maquina,osea en modo real,i digo yo para hacer eso necesitas programar a 16 bits i no a 32 no????? si ando equivocado diganmelo,no es posible hacer eso en 32 bits no???,en la web la primera instruccion que ponian era "bits 16  ;Trabajamos a 16 bits",alguien me explica porfa ????


salu2

MCKSys Argentina

Hola!

Fíjate lo que dice la MSDN sobre esta API:

GetWindowText
The GetWindowText function copies the text of the specified window's title bar (if it has one) into a buffer. If the specified window is a control, the text of the control is copied. However, GetWindowText cannot retrieve the text of a control in another application.

int GetWindowText(
  HWND hWnd,        // handle to window or control with text
  LPTSTR lpString,  // address of buffer for text
  int nMaxCount     // maximum number of characters to copy
);

Parameters
hWnd: Handle to the window or control containing the text.
lpString: Pointer to the buffer that will receive the text.
nMaxCount: Specifies the maximum number of characters to copy to the buffer, including the NULL character. If the text exceeds this limit, it is truncated.


Si miras tu código, verás que el tercer parámetro debería ser la cantidad de caracteres que quieres copiar como máximo, y tu le estás poniendo 0...

Osea, le estás diciendo que quieres leer 0 caracteres del edit.  :)

Aumentando ese parametro, solucionas la cosa...

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Riki_89D

osea que aisn estaria bien:

....

.data?
Buffer db 32 dup(?)
..
..

...

WndProc proc han:HWND,msg2:UINT,wParam:WPARAM,lParam:LPARAM
Local hand:HWND
.IF msg2 == WM_DESTROY
invoke PostQuitMessage,0
.ELSEIF msg2 == WM_CREATE

invoke CreateWindowEx,NULL,offset Control1,NULL,\
WS_CHILD or WS_VISIBLE or WS_BORDER or ES_MULTILINE,\
100,100,100,100,han,0,NULL,NULL
mov hand,eax

invoke CreateWindowEx,NULL,offset Control2,offset TxtBot,\
WS_CHILD or BS_DEFPUSHBUTTON or WS_VISIBLE,\
100,30,100,40,han,IDM_BOT,NULL,NULL


.ELSEIF msg2 == WM_COMMAND
.IF wParam == IDM_BOT

invoke GetWindowText,hand,offset Buffer,90    ;Pongo 90 por poner nu num

PUSH 0
PUSH 0
PUSH offset Buffer
PUSH han
CALL [MessageBox]
.ENDIF

.ELSE

invoke DefWindowProc,han,msg2,wParam,lParam
RET
.ENDIF
xor eax,eax
ret

WndProc endp

end start




estaria bien asin ????


por que no me funciona :S

YST

Por cierto no puedes ponerle 90 si el buffer es de un maximo de 32 :P

Lo otro arregla un poco tu ortografia .


Yo le enseñe a Kayser a usar objetos en ASM

Riki_89D

Hola YST,gracias por contestar,en vez de 90 puse 25,desgraciadamente sigue sin funcionar,el mensaje no me mnuestra lo que escribo en el edit,no lo entiendo,se que una vez lo logre pero no me acuerdo:(

Saint Iker

Pon la variable hand global o si lo prefieres ( yo lo prefiero ) utiliza GetDlgItem para obtener el handle por el ID del control, no te saca el texto por que simplemente el handle no es valido ya que es una variable local que se pierde una vez procesado el mensaje WM_CREATE.

Salu2.

Att: Iker

Riki_89D

Hola iker,como ago para hacer la variable Hand como Global en vez de Local???



salu2 y gracias de antemano

YST

Cita de: Riki_89D en  1 Enero 2010, 19:08 PM
Hola iker,como hago para hacer la variable Hand como Global en vez de Local???



salu2 y gracias de antemano
Código (asm) [Seleccionar]

.data?
Buffer db 32 dup(?)
hand dd ?


Yo le enseñe a Kayser a usar objetos en ASM

Saint Iker

Ya tienes de por si una variable global ( en el .data ) solo es agregar el hand como global.

hand       dd  0

Salu2

Att: Iker

Riki_89D

Ok muchas gracias a todo,se me ocurrio ahcer esto:


invoke FindWindow,0,offset Capt
invoke FindWindowEx,eax,0,offset Control1,0
invoke GetWindowText,eax,offset Buffer,32



offset Capt = Cabecera de la ventana principal
offset Control1 = Control1 db 'EDIT',0

me fue muy bien,me soluciono el problema ^^

por fin recorde como lo hice,muchas gracias por averme ayudado gracias a todos de verdad i un feliz año!!!!