consulta

352 views
Skip to first unread message

David Tato Jimenez

unread,
Mar 4, 2021, 12:21:59 AM3/4/21
to oo...@googlegroups.com
Hola a todos, como puedo hacer desde mi programa, el simular enviar a
otro programa una pulsacion de tecla, es decir, hacer como que he
pulsado el ENTER sin haberlo hecho.

Gracias.

david david

unread,
Mar 4, 2021, 12:53:19 PM3/4/21
to oo...@googlegroups.com

Hola a todos, tenemos alguna funcion que haga esto, que creo es lo que necesito



-------- Mensaje reenviado --------
Asunto: [oohg] consulta
Fecha: Thu, 4 Mar 2021 06:21:55 +0100
De: David Tato Jimenez <jimenezt...@gmail.com>
Responder a: oo...@googlegroups.com
Para: oo...@googlegroups.com


Hola a todos, como puedo hacer desde mi programa, el simular enviar a otro programa una pulsacion de tecla, es decir, hacer como que he pulsado el ENTER sin haberlo hecho.

Gracias.

-- 
Has recibido este mensaje porque estás suscrito al grupo "[oohg]" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a oohg+uns...@googlegroups.com.
Para ver este debate en la Web, visita https://groups.google.com/d/msgid/oohg/6fa5d809-111a-34e3-bf01-767a965de9dd%40gmail.com.

Ricardo Sassy

unread,
Mar 4, 2021, 2:28:14 PM3/4/21
to oo...@googlegroups.com

Hola David.

Desde la época de Clipper viene la función KEYBOARD() que introduce en el buffer del teclado un carácter o string de caracteres simulando la pulsación de dichas teclas.

 

Saludos...

Ricardo Sassy

 

KEYBOARD

Writes a string or numeric key codes into the keyboard buffer.

Syntax

KEYBOARD <cString>

KEYBOARD <nInkeyCode>

KEYBOARD <aKeyCodes>

Arguments

<cString>

This is the character string that is written into the keyboard buffer.

<nInkeyCode>

Alternatively, a numeric key code can be specified. Normally, the #define constants listed in the Inkey.ch files are used for <nInkeyCode>.

<aKeyCodes>

A mixture of character strings or numeric key codes can be specified as a one dimensional array.

Description

The KEYBOARD command first clears the keyboard buffer and then fills it with the key codes specified as character strin, numeric values or within an array. Thus, all pending key strokes are discarded before new characters are written into the keyboard buffer. They remain in the buffer until being fetched from it during a wait state in which the keyboard buffer is polled for the next key stroke.

Wait states are employed by functions and commands that wait for user input, such as Achoice(), READ or MemoEdit().

Info

See also:

Chr(), CLEAR TYPEAHEAD, HB_KeyPut(), Inkey(), LastKey(), NextKey(), SET KEY, SET TYPEAHEAD

Category:

Input commands

Header:

Inkey.ch

Source:

rtl\inkey.c

LIB:

xhbdll.lib

DLL:

xhbdll.dll

Examples

// The example writes a string into the keyboard buffer so that

// Memoedit() begins editing this text in a new line.

 

   PROCEDURE MAIN

      LOCAL cString

 

      KEYBOARD "xHarbour:" + Chr(13) + Chr(10)

 

      cString := MemoEdit()

 

      CLS

      ? cString

   RETURN

 

// The example does the same as the previous one but

// passes an array to the KEYBOARD command.

 

   PROCEDURE MAIN

      LOCAL cString

 

      KEYBOARD { "xHarbour:", 13, 10 }

 

      cString := MemoEdit()

 

      CLS

      ? cString

   RETURN

image001.png

José Orozco

unread,
Mar 4, 2021, 10:27:10 PM3/4/21
to oo...@googlegroups.com

Buenas noches

 If ! FILE"Configura.Ini" )
      BEGIN INI FILE "Configura.ini"
         SET SECTION "Compartido" ENTRY 'Tipo' TO "Local"
         SET SECTION "Ubicacion" ENTRY 'Unidad' TO Disco
         SET SECTION "Ubicacion" ENTRY 'Ruta' TO Carpr
         SET SECTION "Parametros" ENTRY 'IVA_VENTA' TO "0.19"
         SET SECTION "Parametros" ENTRY 'AnchoPos' TO '1'
      END INI
   ENDIF
   BEGIN Ini File "Configura.Ini"
      GET Tipo_Red Section "Compartido" Entry 'Tipo'
      GET Unidad Section "Ubicacion" Entry 'Unidad'
      GET Ruta Section "Ubicacion" Entry 'Ruta'
      GET IVA_VENTA Section "Parametros" Entry 'IVA_VENTA'
      get AnchoPos Section "Parametros" ENTRY 'AnchoPos'
   END Ini

Tengo este codigo para crear (en el caso de que no exista) o leer un archivo .ini... pero en algunas ocaciones debo crear algun parametro adicional (por ej. AnchoPos),  en el momento para actualizar ese .ini debo borrarla para que se vuelva a crear.

Hay forma (o una idea de como hacerlo) de actualizar el archivo .ini?


Muchas Gracias...





Juan Carlos Ocampo de la Cruz

unread,
Mar 5, 2021, 12:54:05 PM3/5/21
to oo...@googlegroups.com
Por ejemplo, para rellenar un formulario web yo hago esto:

oShell := CreateObject( "WScript.Shell" )
oShell:run("chrome.exe https://www.recaudanet.gob.mx/recaudanet/rfc.jsp")
HB_IDLESLEEP(2)
oShell:SendKeys(cTxtApellido1)
oShell:sendkeys("{tab}")
oShell:SendKeys(cTxtApellido2)
oShell:sendkeys("{tab}")
oShell:SendKeys(cTxtNombre)
oShell:sendkeys("{tab}")
oShell:SendKeys(cFecha)
oShell:sendkeys("{tab}{tab}")
oShell:sendkeys("~") //{ENTER}

Consulta:

Saludos

Nippur Lagash

unread,
Mar 5, 2021, 1:31:55 PM3/5/21
to oo...@googlegroups.com
Hola también se puede usar curl para enviar datos por POST/GET a una web (que lo permita claro está).

Saludos,
Fer.MDQ



--
Nippur
Mar del Plata
Buenos Aires
Argentina

David Tato Jimenez

unread,
Mar 5, 2021, 1:57:35 PM3/5/21
to oo...@googlegroups.com

Ricardo gracis por responder.

Windows 10 trae una utilidad de recorte de pantalla muy rapida y facil.

Mi idea es asignar la combinacion de teclas que lanza esta aplicacion de recorte con un boton.

Al pulsar el boton  que declaro a continuacion que sea como si se hubieran pulsado las combinaciones de teclas en el teclado siguiennte: tecla windows + tecla shift + s

Pero no me hace nada.

@ 190,800 BUTTON Button_2 CAPTION "Recortar" PICTURE "recorte.JPG"  ;
              RIGHT ;
              WIDTH 180 HEIGHT 60 ;
              BOLD ;
              TRANSPARENT ;
              SIZE 14 ;
              IMAGEMARGIN {0, 0, 0, 20} ;
              ACTION { || hb_keyPut(VK_LWIN + VK_LSHIFT + VK_S)  }

Jose Antonio Leon Tellez

unread,
Mar 5, 2021, 8:40:54 PM3/5/21
to oo...@googlegroups.com
David,

Si es para copiar la pantalla o print-screen podría utilizar:

         ITEM "Imprimir en formato BMP"  ACTION oWnd:Saveas( "Prueba.bmp",.t.,"bmp" )
         ITEM "Imprimir en formato JPG"   ACTION oWnd:Saveas( "Prueba.jpg",.t.,"jpg" )
         ITEM "Imprimir en formato TIF"    ACTION oWnd:Saveas( "Prueba.tif",.t.,"tif" )
         ITEM "Imprimir en formato PNG"  ACTION oWnd:Saveas( "Prueba.png",.t.,"png" )

Saludos,

José Antonio León Téllez


david david

unread,
Mar 6, 2021, 12:29:36 AM3/6/21
to oo...@googlegroups.com

Jose Antonio gracias por responder. No conocia esta forma pero no es lo que necesito.

Necesito poder activar la utilidad recorte con las teclas windows + tecla shift + s ya que de esta forma entra directamente a poder seleccionar una parte de la pantalla seleccionada por el usuario con el raton y la copia al portapapeles, para despues poderla pegar directamente en otra aplicacion.

Ya he conseguido con la ayuda de este grupo ejecutar la utilidad con shellexecute(0,'OPEN','SnippingTool.exe') pero de esta forma el usuario tiene que dar un paso adicional para capturar una parte de la pantalla que quiera y de la otra forma con las teclas teclas windows + tecla shift + s entra directamente a seleccionar con el raton la zona que quiere copiar

saludos

David Field

unread,
Mar 6, 2021, 12:51:59 AM3/6/21
to [oohg]
Hola José,

Te recomiendo consultar las funciones hb_ini... en  hb_I · Petewg/harbour-core Wiki · GitHub 
No sé si sea fallo de Google pero idealmente abre un nuevo tema para algo que no tenga que ver con el tema en cuestión.
Esto permitirá a otros usuarios poder realizar búsquedas a sus problemas.

Saludos,
David Field

Rosario Giuffré

unread,
Mar 6, 2021, 7:56:11 AM3/6/21
to oo...@googlegroups.com
Como estas José.

Para modificarlo, lo leo y edito, modifico lo necesario y lo vuelvo a grabar como lo haces y listo.
Espero te sirva.

Rosario Giuffré
SoftSar Sistemas

--
Has recibido este mensaje porque estás suscrito al grupo "[oohg]" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a oohg+uns...@googlegroups.com.

Juan Carlos Ocampo de la Cruz

unread,
Mar 8, 2021, 11:10:14 AM3/8/21
to oo...@googlegroups.com
Hola Nippur:

Yo lo he hecho con automatización OLE en Internet Explorer cuando la página me permite rellenar el formulario automático y si no con el envío de caracteres al buffer.

Una vez lo intente con el CURL de línea de comandos rellenar un formulario y no me funciono ¿Tienes un demo con el CURL de la librería harbour?

Saludos.


david david

unread,
Mar 8, 2021, 1:41:05 PM3/8/21
to oo...@googlegroups.com

Hola Juan Carlos Ocampo, donde puedo leer sobre oShell?

Con tu ayuda he asociado una rutina parecida a la tuya a un botón, para que se rellenen datos automaticamente en una aplicacion independiente a mi aplicacion, y lo hace bien.

El problema que tengo que es que al pulsar de nuevo el boton, se vuelve a abrir otra ventana del chrome y asi tantas veces como pulse el boton.

Hay alguna manera de detectar desde mi aplicacion con oShell que si el chrome ya está abierto, no lo vuelva a abrir

Gracias

Juan Carlos Ocampo de la Cruz

unread,
Mar 8, 2021, 1:59:06 PM3/8/21
to oo...@googlegroups.com
Hola David:

Googlea WScript.Shell para buscar mas información, por el momento no tengo idea de como evitar abrir Chrome cuando ya esta abierto, saludos.

David Tato Jimenez

unread,
Mar 8, 2021, 2:12:01 PM3/8/21
to oo...@googlegroups.com

Hola a todos, continuando con esto, creo que lo que no hago bien es encadenar las tres teclas necesarias para abrir la utilidad recorte directamente.

Ya que si en la ACTION del BUTTON solamente pongo ACTION { ||    _PushKey(VK_LWIN )  } si me abre el menu windows.

Pero si le pongo ACTION { ||  _PushKey( (VK_LWIN) + (VK_LSHIFT) + (VK_S) )  } no me hace nada y no funciona.

Saludos.


El 05/03/2021 a las 19:57, David Tato Jimenez escribió:

Ricardo gracis por responder.

Windows 10 trae una utilidad de recorte de pantalla muy rapida y facil.

Mi idea es asignar la combinacion de teclas que lanza esta aplicacion de recorte con un boton.

Al pulsar el boton  que declaro a continuacion que sea como si se hubieran pulsado las combinaciones de teclas en el teclado siguiennte: tecla windows + tecla shift + s

Pero no me hace nada.

@ 190,800 BUTTON Button_2 CAPTION "Recortar" PICTURE "recorte.JPG"  ;
              RIGHT ;
              WIDTH 180 HEIGHT 60 ;
              BOLD ;
              TRANSPARENT ;
              SIZE 14 ;
              IMAGEMARGIN {0, 0, 0, 20} ;

              ACTION { || + VK_LSHIFT + VK_S)  }

Juan Carlos Ocampo de la Cruz

unread,
Mar 8, 2021, 2:21:23 PM3/8/21
to oo...@googlegroups.com
* * *
* Programa.: WebIssste.prg
* Autor....: JOC
* Fecha....: 28/01/2013
* Proposito: Buscar si existe en los registros del ISSSTE <F7>, paso de parametros por metodo POST
*            Basado en un ejemplo de Jose Lalin <http://www.xailer.com/forum/index.php?t=msg&goto=45124&>
*                                                https://www.xailer.com/forum/viewtopic.php?t=10188
*            Para llenar formulario en Win7: http://www.pctoledo.com.br/forum/viewtopic.php?f=2&t=15981
* Ver tambien: https://groups.google.com/forum/#!topic/harbour-devel/A8WVJK9q6S4
* * *

PROCEDURE BuscaWeb9(cProc,nLinea,cVar)
LOCAL aEdo, cTxtNombre, cTxtApellido1, cTxtApellido2, cFecha, cSexo, nEntidadNac, dFecha_Nac, cCurp, nCurp

IF !EMPTY(VNOM+VAPL1)

  SAVE SCREEN TO PA0001
  set color to W/RB
  BoxShadow(10,29,21,48)
  @10,29 TO 21,48
  nCurp=ACHOICE(11,30,21,47,aCurp)
  set color to W/B
  RESTORE SCREEN FROM PA0001

  IF nCurp=0
    RETURN
  ELSE
    cCurp=aCurp[nCurp]
  ENDIF

  oIE:=TOleAuto():New("InternetExplorer.Application")

  IF Ole2TxtError()!="S_OK"
    ALERT("No se pudo conectar a internet: "+Ole2TxtError())
    oIE:End()
    RETURN NIL
  ENDIF
 
  oIE:Visible := .T.
  oIE:Invoke("Navigate","https://oficinavirtual.issste.gob.mx/Servicios/Acreditaci%C3%B3n-de-No-Afiliaci%C3%B3n")
 
  IF Ole2TxtError()!="S_OK"
    ALERT("No se pudo conectar a internet: "+Ole2TxtError())
    oIE:End()
    RETURN NIL
  ENDIF

  //Esperar a la confirmacion de carga de la pagina
  WAITPERIOD(2000) // 500 = pausa de 5 segundos

  WHILE oIE:Busy
    HB_IDLESLEEP(1)
  END

  // ver el codigo fuente html
  // Rellenar el campo, por ejemplo:
  // <input type="text" name="txtCurp" size="23" maxlength="23">
  //  oExplorer:Document:Forms(0):Elements("q"):Value := 'something'

   oIE:= oIE:Document()
   oIE:All:Item("dnn$ctr462$ViewNoAfil$txtCURP",0):Value:=cCurp
 
 ELSE
 ALERT("Capture los datos completos")
ENDIF

RETURN

El lun, 8 mar 2021 a las 12:41, david david (<dtat...@gmail.com>) escribió:

Desarrollador MG

unread,
Mar 9, 2021, 5:57:06 AM3/9/21
to oo...@googlegroups.com
Hola, David.
Prueba por favor así:
 
ACTION { ||  _PushKey( VK_LWIN + VK_LSHIFT  +  VK_S)   }
 
 
image001.png

david david

unread,
Mar 9, 2021, 8:27:11 AM3/9/21
to oo...@googlegroups.com

Hola Mario, gracias por responder.

Esa opcion tambien la habia probado. Compila bien, se ejecuta el programa y cuando pulso el boton asociado a esta ACTION, no se hace nada, no sale mensaje ni se activa la utilidad recorte.

No se que puede estar pasando.

Saludos.

Miguel Ingles

unread,
Mar 10, 2021, 6:15:33 AM3/10/21
to oo...@googlegroups.com
Hola

Yo me he creado una utilidad para leer y grabar ficheros INI, con solo una linea.


Saludos
Miguel


Ricardo Sassy

unread,
Mar 10, 2021, 11:51:49 AM3/10/21
to oo...@googlegroups.com

Hola Miguel.

Muchas gracias por tu aporte.

Es muy ingenioso.

 

Ricardo Sassy

 

david david

unread,
Mar 12, 2021, 11:28:33 AM3/12/21
to oo...@googlegroups.com

Juan Carlos, gracias por responder.

¿Fernando habria alguna posibilidad de crear el evento SendKeys para el control ActiveX?

Gracias.

Fernando Yurisich

unread,
Mar 12, 2021, 11:58:24 AM3/12/21
to oo...@googlegroups.com
Luego de instanciado el control ACTIVEX puedes acceder a sus propiedades y métodos con la sintaxis tradicional.
O sea oActiveX:SendKeys
Mira los ejemplos de la carpeta samples\activex.

Saludos
Fernando Yurisich

OOHG project is located at https://github.com/oohg and QPM project is located at https://github.com/teamQPM
If you value my work to support this project, please consider supporting me with a donation via PayPal or Amazon Gift Card.

david david

unread,
Mar 15, 2021, 2:49:25 PM3/15/21
to oo...@googlegroups.com
Hola, queria hacerlo dos preguntas.

- alguna funcion en harbour que lea el num. de serie del disco duro

- como pasarle a una pagina web la letra "ñ" o "Ñ. Me sale un simbolo
raro. Ya he probado con hb_oemtoansi() y no lo hace correctamente.

Gracias

avazq...@gmail.com

unread,
Mar 15, 2021, 3:25:15 PM3/15/21
to oo...@googlegroups.com
Para el nº del disco encontré esto ... te puede servir.

******************************************************************************
******************************************************************************
******************************************************************************
**************************************
Function Verhddserial && Ver Nº Disco Duro
**************************************
msginfo (hbserial( "c:\" ))

Return Nil

***************************************
Function HbSerial(cDrive)
**************************************

Local n := HDGETSERIAL( cDrive )
Local cSerial := alltrim(str(n)), cHex := ""
Local cResult := ''

for i := Len( cSerial ) to 1 step -1
cHex += PadL( DecToHex( Asc( SubStr( cSerial, i, 1 ) ) ),2, "0" )
next

cResult := SubStr(cHex,1,4)+'-'+SubStr(cHex,5,4)

Return cResult

**************************************
Function DecToHex(nNum, _digit)
**************************************

Local i:=0, nTmp:=1, cRet:=''

_digit := if(_digit=Nil, 1, _digit)
do while nNum != 0
cRet := if(nNum%16<10, str(nNum%16,1,0), chr(nNum%16+55))+cRet
nNum := int(nNum/16)
i++
enddo

Return replicate('0', _digit-i)+cRet

#pragma begindump

#include "windows.h"
#include "hbapi.h"

unsigned long Get_SerialNumber(char* RootPathName)
{
unsigned long SerialNumber;

GetVolumeInformation(RootPathName, NULL, 0, &SerialNumber, NULL,NULL, NULL, 0);
return SerialNumber;
}

HB_FUNC( HDGETSERIAL)
{
hb_retnl( Get_SerialNumber(hb_parc(1)) );
}

#pragma enddump
******************************************************************************
******************************************************************************
******************************************************************************

-----Mensaje original-----
De: oo...@googlegroups.com <oo...@googlegroups.com> En nombre de david david
Enviado el: lunes, 15 de marzo de 2021 19:49
Para: oo...@googlegroups.com
Asunto: [oohg] consulta
--
Has recibido este mensaje porque estás suscrito al grupo "[oohg]" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a oohg+uns...@googlegroups.com.
Para ver este debate en la Web, visita https://groups.google.com/d/msgid/oohg/befc8a2a-93b5-8674-2bc9-5fce5eabbdde%40gmail.com.

David Tato Jimenez

unread,
Mar 15, 2021, 3:48:55 PM3/15/21
to oo...@googlegroups.com

Hola, mil gracias, me ha servido de utilidad.

Indicarte que al compilar me ha dado un warning en la linea

unsigned long Get_SerialNumber(char* RootPathName)

cambiandola por esta se arregla

unsigned long Get_SerialNumber(const char* RootPathName)


Libre de virus. www.avg.com

Sergio Castellari [Gmail]

unread,
Mar 15, 2021, 7:59:22 PM3/15/21
to oo...@googlegroups.com

Hola gente,

 

Se encuentra disponible la nueva versión de la interface Teresa 2.20.151 para acceso a los servidores AFIP.

 

NOVEDADES desde la anterior versión (2.14.017):

·         Nuevo formato interno de gestión de archivos que permite “separar” completamente Teresa del Sistema de Gestión Comercial, facilitando el uso en entornos de Red Local con carpetas distribuidas. El funcionamiento es 100% compatible con la versión anterior.

·         Mejoras internas en la codificación que optimiza recursos.

·         Pequeña reducción de tiempo en las solicitudes automatizadas de TA (Ticket de Acceso).

·         Reporte y solución de pequeño BUG en una función de listado.

·         ¡¡¡NUEVO!!! Se agrega servicio “wsex” para Comprobantes de EXPORTACION.

·         Se actualiza DemoTeresa_Usuario.exe incluyendo TODAS las nuevas funcionalidades.

·         Se actualizan todos los documentos de ayuda.

 

IMPORTANTE: Para todos los usuarios actuales de Teresa, que quieran utilizar esta nueva versión, recomendamos hacer una copia de seguridad y realizar pruebas en un entorno de desarrollo antes de sobrescribir esta versión.  Si bien, se ha realizado todo el “testeo” posible antes de publicarla, pudieran existir Bugs o incompatibilidades no observadas.

Cualquier novedad, falla o ideas nuevas serán bien recibidas.

 

¡GRACIAS TOTALES!...Teresa está siendo utilizada en producción en varios entornos de desarrollo sin problemas:

·         VFP 9

·         VFP 7

·         Harbour-Consola

·         Harbour-ooHG

·         Harbour-MiniGUI

·         Visual Basic

·         Cobol

·         Linux (Intermediación WinE)

·         Genexus 6

 

Link de descarga:

 https://mega.nz/file/dQ8CUJ4A#7dD7iPg-y_cLPzUGlb_hzYtobJ6vGmojkANer5z2rQI

 

 

Saludos,

Sergio Castellari

SDC  Soluciones Informáticas

 

 

 

 

 

david david

unread,
Mar 16, 2021, 2:00:31 AM3/16/21
to oo...@googlegroups.com
Hola a todos, a ver si alguien puedo ayudarme con un control ActiveX.

Creo el control ActiveX como pongo a continuacion   

 
curl:="https://api.whatsapp.com/send?phone=" + str(prefijo) + telefono +"&text=" + mensajecompleto
 
      if !HB_IsObject(  oActiveX )
         @  0, 0 ACTIVEX ActiveX PARENT Win_1 WIDTH 100 HEIGHT 100 PROGID "Shell.Explorer" OBJ oActiveX DISABLED INVISIBLE
      endif            
      oActiveX:Navigate( curl )
      HB_IDLESLEEP(3)
      oActiveX:sendkeys("~")
      oActiveX:Release()

Pongo oActiveX:sendkeys("~") porque en otras paginas y emails he leido que enviandole a la api de Whatsapp este simbolo "~" es como si el usuario hubiera pulsado el ENTER

Pero me da este error

--
Has recibido este mensaje porque estás suscrito al grupo "[oohg]" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a oohg+uns...@googlegroups.com.
--
Has recibido este mensaje porque estás suscrito al grupo "[oohg]" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a oohg+uns...@googlegroups.com.


--
Nippur
Mar del Plata
Buenos Aires
Argentina
--
Has recibido este mensaje porque estás suscrito al grupo "[oohg]" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a oohg+uns...@googlegroups.com.
--
Has recibido este mensaje porque estás suscrito al grupo "[oohg]" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a oohg+uns...@googlegroups.com.
--
Has recibido este mensaje porque estás suscrito al grupo "[oohg]" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a oohg+uns...@googlegroups.com.
--
Has recibido este mensaje porque estás suscrito al grupo "[oohg]" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a oohg+uns...@googlegroups.com.

avazq...@gmail.com

unread,
Mar 16, 2021, 2:45:09 AM3/16/21
to oo...@googlegroups.com

A mí me ha funcionado esto.

 

********************************

function prep2_whatsapp

*****************************+

   Local oShell

   oShell := CreateObject( "WScript.Shell" )

   oShell:run("chrome.exe https://api.whatsapp.com/send?phone=34XXXXXXXX" )

   Sleep(1500)

   oShell:sendkeys("{tab}{tab}")

   oShell:SendKeys("~")

   Sleep(5000)

   oShell:sendkeys("Mensaje de prueba")

   oShell:SendKeys("~")

Return nil

 

 

Saludos.

 

Antonio Vázquez

Avazq...@gmail.com

 

 

 

De: oo...@googlegroups.com <oo...@googlegroups.com> En nombre de david david

Enviado el: martes, 16 de marzo de 2021 7:00
Para: oo...@googlegroups.com
Asunto: Fwd: [oohg] consulta

 

Hola a todos, a ver si alguien puedo ayudarme con un control ActiveX.

image001.png

David Tato Jimenez

unread,
Mar 16, 2021, 5:55:50 PM3/16/21
to oo...@googlegroups.com, avazq...@gmail.com

Hola Antonio, gracias por responder.

Efectivamente el mensaje se envia, pero encuentro los siguientes problemas:

- se demora mucho el envio, como unos 35 segundos. De mi forma tarda un par de segundos, pero no consigo enviar el ENTER para que se valide el mensaje directamente.

- cada vez que envias un mensaje, se vuelve a abrir una nueva ventana en el explorador, aunque la anterior la tengas abierta. No encuentro solucion. De mi forma se abre, pero en modo invisible.

- El mensaje no se envia si pones oShell:sendkeys("Mensaje de prueba, mañana"). Que es otro de los problemas que tengo y consulte en otro email. De mi forma se envia el mensaje pero no sale correctamente la ñ y las vocales con tilde á,é,í,ó,ú

Sergio Castellari [Gmail]

unread,
Mar 16, 2021, 6:23:42 PM3/16/21
to oo...@googlegroups.com

Hola gente,

 

Wow!!! Recién veo este mail…

 

Gracias Miguel por compartir este código.

Facilita un montón la administración de archivos INI.

 

Saludos,

Sergio Castellari

 

 

 

De: oo...@googlegroups.com [mailto:oo...@googlegroups.com] En nombre de Miguel Ingles
Enviado el: miércoles, 10 de marzo de 2021 08:15 a.m.
Para: oo...@googlegroups.com
Asunto: Re: [oohg] Re: Consulta : Manejo de Archivos .ini

 

Hola

David Tato Jimenez

unread,
Mar 23, 2021, 1:25:32 AM3/23/21
to oo...@googlegroups.com, avazq...@gmail.com

Hola Antonio, he seguido haciendo pruebas.

Si utilizo tu codigo con oShell:run("chrome.exe https://web.whatsapp.com/send?phone=34XXXXXXXX" )

Cada vez que mando un mensaje, se me abre una nueva ventana en el explorador. A parte demora muchisimo el envio del texto. Además hace cosas distintas si es el primer mensaje enviado o no. En el primer mensaje enviado todo medio normal, digo medio normal, sino envio caracteres como la ñ o palabras tildadas con acentos.

Este texto: Hola, Qué tal estás, mañana

lo envia como: Hola, QuT tal ests, maana

Y he probado declarandolo de estas dos formas distintas y no sale correcto.

  local mensaje:=HB_OEMTOANSI("Hola, Qué tal estás, mañana")
  local mensaje:='Hola, Qué tal estás, mañana'

Además en el segundo mensaje enviado, se vuelve a abrir una nueva ventana en el explorador y sigue demorando muchisimo el envio del texto. En este segundo mensaje, el texto enviado, se pone en un campo que es donde se escribe para buscar un contacto.

Para que tu rutina funcione bien, tengo que simplificarla a:

  Local oShell
   local mensaje:=HB_OEMTOANSI("Hola, Qué tal estás, mañana")

  oShell := CreateObject( "WScript.Shell" )

  oShell:run("chrome.exe https://WEB.whatsapp.com/send?phone=34XXXXXXXXX" )
   Sleep(1000)
   oShell:sendkeys(mensaje)
   oShell:SendKeys("~")

Pero sigo teniendo el problema de que se abre una nueva ventana en chrome en cada mensaje y el problema de los caracteres en el texto.

Si utilizo oShell:run("chrome.exe https://api.whatsapp.com/send?phone=34XXXXXXXX" )

Me hace exactamente lo mismo que con la opcion anterior, pero primero me abre la ventana de chrome una y otra vez por cada mensaje enviado y despues se envia el mensaje desde la aplicacion whatsapp desktop

No se si tendrá algo que ver algo el sistema operativo utilizado o la version de OOHG.

En mi caso Windows 10 Pro 64 bits. Y como version de Harbour, MinGw y OOHG la siguiente.

david david

unread,
Mar 23, 2021, 1:25:48 AM3/23/21
to oo...@googlegroups.com

Hola a todos, alguna ayuda al respecto.

Gracias.

-------- Mensaje reenviado --------
Asunto: Fwd: [oohg] consulta
Fecha: Tue, 16 Mar 2021 07:00:15 +0100
De: david david <dtat...@gmail.com>
Para: oo...@googlegroups.com

avazq...@gmail.com

unread,
Mar 23, 2021, 4:12:52 AM3/23/21
to oo...@googlegroups.com

 

Buenos días, David.

 

No te doy solución, pero te cuento mi experiencia.

 

Si pongo el texto en la misma línea que llama a whatsapp, pierde el formato y no sale bien.

 

Yo lo que hago es copiar a memoria lo que quiero enviar (con formato, negrita, etc etc) y me sale bien, aunque no es directo, tengo que pulsar manualmente, una vez que abra CTRL+V y ENTER

 

SI lo hago así, sale perfecto.

 

Efectivamente, es un poco engorroso que abra una ventana del navegador cada ve< que lances un whatsapp, pero por ahora no encuentro otra solución.

 

Te pego un pantallazo de cómo me sale en el móvil. Si quieres pásame por privado tu tfno y te envío uno.

 

***********************************************

function prep_whatsapp_venta(oRsVentas, oRsAlbaran)

***********************************************

Local aLineas:={}, ni

 

 

   aadd(aLineas,'*'+aRecEmpresa+'*  ('+dtoc(_dfecha)+')'+chr(10)+chr(13))

   aadd(aLineas,"Albarán:  "+str(oRsVentas:idalbaran,8)+chr(13)+chr(10)+"  Fecha: "+dtoc(oRsVentas:fecha)+chr(10)+chr(13))

             if oRsVentas:numfactura>0

                           aadd(aLineas,"F. Simpl: "+str(oRsVentas:numfactura,8)+chr(13)+chr(10)+"  Fecha: "+dtoc(oRsVentas:fechafactura)+chr(10)+chr(13))

             endif

   aadd(aLineas,"*"+ado_value('select nfiscal from clientes where id='+str(oRsVentas:idcliente,8))+"*"+chr(10)+chr(13))

   oRsAlbaran:gotop()

   for ni:=1 to oRsAlbaran:reccount()

             aadd(aLineas,substr(oRsAlbaran:articulo+space(40),1,40)+chr(10))

                           aadd(aLineas,"     "+transform(oRsAlbaran:cantidad,"@E 9999")+"  "+transform(oRsAlbaran:punidad,"@E 99,999.99")+"  "+transform(oRsAlbaran:dto,"@E 99,999.99")+" "+oRsAlbaran:tipodto+"  "+transform(oRsAlbaran:totlinea,"@E 99,999.99")+chr(10))

                           oRsAlbaran:skip()

             next

   aadd(aLineas," "+chr(10))

             if oRsVentas:formapago="1.- Contado"

                           aadd(aLineas,"*Total: "+transform(oRsVentas:importetotal,"@E 999,999.99")+chr(10)+chr(13))

             else

                           aadd(aLineas,"*Total a pagar: "+transform(oRsVentas:importetotal,"@E 999,999.99")+" €  Venta a crédito.*"+chr(10)+chr(13))

             endif

             aadd(aLineas,"Gracias por su compra."+chr(13))

 

    a0:=""

             for ni:=1 to len(aLineas)

                 a0+=aLineas[ni]

             next

    SetClipboardText(a0+"Gire el móvil para verlo mejor")

             ctel:=ado_value('select movil from clientes where id='+str(oRsVentas:idcliente,8))

             ctel:=inputbox("Nº Móvil:",, cTel )

             if valtype(cTel) $ "U" .or. empty(ctel)

             else

                           EXECUTE FILE('https://api.whatsapp.com/send?phone=34'+strtran(alltrim(ctel)," ",""))

             endif    

 

 

 

 

 

 

 

De: oo...@googlegroups.com <oo...@googlegroups.com> En nombre de david david

image001.png
image002.png

Fernando Yurisich

unread,
Mar 23, 2021, 2:12:41 PM3/23/21
to oo...@googlegroups.com
David:

En este enlace encontrarás un ejemplo que permite enviar mensajes por WhatsApp.
Está basado en un script que encontré en Internet.

Saludos
Fernando Yurisich


OOHG project is located at https://github.com/oohg and QPM project is located at https://github.com/teamQPM
If you value my work to support this project, please consider supporting me with a donation via PayPal or Amazon Gift Card.

david david

unread,
Mar 27, 2021, 2:44:20 PM3/27/21
to oo...@googlegroups.com

Antonio gracias por tu codigo, pero entiendo que utilizas este codigo porque es para tu propio envio y no te importa copiar el texto a memoria y despues cuando se abre whatsapp, pulsar CTRL+V y ENTER .

Mi idea es hacerlo automatico, ya que me lo ha pedido un cliente.

Mil gracias.

David Tato Jimenez

unread,
Mar 27, 2021, 3:47:03 PM3/27/21
to oo...@googlegroups.com

Fernando gracias por tu ayuda.

Con tu ejemplo, se sigue abriendo una y otra vez, una ventana del explorador cada vez que se envia un mensaje. En el proceso desde que envias el mensaje, se abre la pagina de whatsapp en el explorador de internet, y despues se abre Whatsapp Desktop, demora un poco, tanto es asi, que si en ese proceso cambias la ventana activa por ejemplo a Word, el telefono y mensaje escrito en el script se copia en el documento de Word.

Aparte el script sirve siempre y cuando el mensaje a enviar sea a un contacto que tengas en la agenda. Si se envia a un numero telefono directamente, no se envia el mensaje y se escribe el tanto el numero de telefono como el texto del mensaje en el campo superior de busqueda de contactos.

Entiendo que al enviarme este ejemplo, el metodo oActiveX:SendKeys en el control ACTIVEX no es posible.

Seguiré investigando

Gracias.

david david

unread,
Apr 7, 2021, 12:23:31 AM4/7/21
to oo...@googlegroups.com

Hola a todos, como continuacion de este email, de esta forma he resuleto el envio de caracteres especiales y vocales acentuadas.

Solo me faltaria el metodo oActiveX:SendKeys en el control ACTIVEX, pero no tengo los conocimientos necesarios por si alguien me puede ayudar a desarrollarlo.

codigo para solución de caracteres especiales

  mensajelimpio:=strtran(mensajelimpio,"ñ","%C3%B1")
   mensajelimpio:=strtran(mensajelimpio,"Ñ","%C3%91")
   mensajelimpio:=strtran(mensajelimpio,"Á","%C3%81")
   mensajelimpio:=strtran(mensajelimpio,"á","%C3%A1")
   mensajelimpio:=strtran(mensajelimpio,"É","%C3%89")
   mensajelimpio:=strtran(mensajelimpio,"é","%C3%A9")
   mensajelimpio:=strtran(mensajelimpio,"Í","%C3%8D")
   mensajelimpio:=strtran(mensajelimpio,"í","%C3%AD")
   mensajelimpio:=strtran(mensajelimpio,"Ó","%C3%93")
   mensajelimpio:=strtran(mensajelimpio,"ó","%C3%B3")
   mensajelimpio:=strtran(mensajelimpio,"Ú","%C3%BA")
   mensajelimpio:=strtran(mensajelimpio,"ú","%C3%9A")
   mensajelimpio:=strtran(mensajelimpio,"º","%C2%BA")
   mensajelimpio:=strtran(mensajelimpio,"ª","%C2%AA")
   mensajelimpio:=strtran(mensajelimpio,"\","%5C")
   mensajelimpio:=strtran(mensajelimpio,"¿","%C2%BF")
   mensajelimpio:=strtran(mensajelimpio,"|","%7C")
   mensajelimpio:=strtran(mensajelimpio,"{","%7B")
   mensajelimpio:=strtran(mensajelimpio,"}","%7D")
   mensajelimpio:=strtran(mensajelimpio,CHR(13),"%0A")



-------- Mensaje reenviado --------
Asunto: Re: Fwd: [oohg] consulta
Fecha: Sat, 27 Mar 2021 20:46:59 +0100
De: David Tato Jimenez <jimenezt...@gmail.com>
Responder a: oo...@googlegroups.com
Para: oo...@googlegroups.com

edson.gran...@gmail.com

unread,
Apr 7, 2021, 7:35:43 PM4/7/21
to oo...@googlegroups.com

Hola

Debes darle una mirada a las funciones HB_OEMTOANSI() y HB_ANSITOOEM() de Harbour.

Probablemente con ello soluciones tu problema..

Edson
--
Enviado desde Outlook Email App para Android

martes, 06 abril 2021, 11:23p. m. -05:00 de david david dtat...@gmail.com:



-------- Mensaje reenviado --------


Fernando gracias por tu ayuda.

Con tu ejemplo, se sigue abriendo una y otra vez, una ventana del explorador cada vez que se envia un mensaje. En el proceso desde que envias el mensaje, se abre la pagina de whatsapp en el explorador de internet, y despues se abre Whatsapp Desktop, demora un poco, tanto es asi, que si en ese proceso cambias la ventana activa por ejemplo a Word, el telefono y mensaje escrito en el script se copia en el documento de Word.

Aparte el script sirve siempre y cuando el mensaje a enviar sea a un contacto que tengas en la agenda. Si se envia a un numero telefono directamente, no se envia el mensaje y se escribe el tanto el numero de telefono como el texto del mensaje en el campo superior de busqueda de contactos.

Entiendo que al enviarme este ejemplo, el metodo oActiveX:SendKeys en el control ACTIVEX no es posible.

Seguiré investigando

Gracias.


El 23/03/2021 a las 19:12, Fernando Yurisich escribió:
David:

En este enlace encontrarás un ejemplo que permite enviar mensajes por WhatsApp.
Está basado en un script que encontré en Internet.

Saludos
Fernando Yurisich


OOHG project is located at  https://github.com/oohg and QPM project is located at https://github.com/teamQPM
If you  value my work to support this project , please consider supporting me with a donation via  PayPal  or Amazon Gift Card .

El mar, 23 de mar. de 2021 a la(s) 02:25, david david ( dtat...@gmail.com) escribió:

Hola a todos, alguna ayuda al respecto.

Gracias.

-------- Mensaje reenviado --------
Asunto: Fwd: [oohg] consulta
Fecha: Tue, 16 Mar 2021 07:00:15 +0100
De: david david
Hola a todos, a ver si alguien puedo ayudarme con un control ActiveX.

Creo el control ActiveX como pongo a continuacion   

 
curl:="https://api.whatsapp.com/send?phone=" + str(prefijo) + telefono +"&text=" + mensajecompleto
 
      if !HB_IsObject(  oActiveX )
         @  0, 0 ACTIVEX ActiveX PARENT Win_1 WIDTH 100 HEIGHT 100 PROGID "Shell.Explorer" OBJ oActiveX DISABLED INVISIBLE
      endif            
      oActiveX:Navigate( curl )
      HB_IDLESLEEP(3)
      oActiveX:sendkeys("~")
      oActiveX:Release()

Pongo oActiveX:sendkeys("~") porque en otras paginas y emails he leido que enviandole a la api de Whatsapp este simbolo "~" es como si el usuario hubiera pulsado el ENTER

Pero me da este error


   

El 12/03/2021 a las 17:58, Fernando Yurisich escribió:
Luego de instanciado el control ACTIVEX puedes acceder a sus propiedades y métodos con la sintaxis tradicional.
O sea oActiveX:SendKeys
Mira los ejemplos de la carpeta samples\activex.

Saludos
Fernando Yurisich

OOHG project is located at  https://github.com/oohg and QPM project is located at https://github.com/teamQPM
If you  value my work to support this project , please consider supporting me with a donation via  PayPal  or Amazon Gift Card .
Reply all
Reply to author
Forward
0 new messages