Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   No consigo que simule pulsacion del boton en aplicacion externa (https://www.clubdelphi.com/foros/showthread.php?t=91694)

Snaked 03-04-2017 17:14:32

No consigo que simule pulsacion del boton en aplicacion externa
 
Código PHP:



void __fastcall TForm1
::Button1Click(TObject *Sender)
{
  
Memo1->Lines->Clear();
  
DETECTA_REDES();
  
ShellExecute(NULL,  // Handle de la fenêtre parent
                 
"open", // Action à effectuer
                 
"JumpLittle.exe", // Fichier
                 
"", // Paramètres
                 
"", // Répertoire par défaut
                 
SW_SHOWDEFAULT);

  
ClickBotonIzquierdo(660, 475);

}



void ClickBotonIzquierdo(int X, int Y)
{
// Esta rutina sirve para hacer un click en las coordenadas
// X-Y de la pantalla.
int ClientX = 0; int ClientY = 0;
HWND Window; HWND Parent;
TRect WindowRect;

// Primero situa el cursor del ratón en la posición deseada
SetCursorPos(X, Y);

// Averiguamos el identificador del objeto que se encuentra
// en dichas coordenadas. (No funciona para ventanas ocultas
// o deshabilitadas)
Window = WindowFromPoint(Point(X, Y));

// Si el identificador devuelto es distinto de 0 es que
// realmente hay un objeto en dichas coordenadas
if (Window < 0 || Window > 0)
{
// Averiguamos las coordenadas del objeto
GetWindowRect(Window, &WindowRect);

// y trasladomos las coordenadas del punto donde se desea
// hacer click a las coordenadas del objeto encontrado
ClientX = X - WindowRect.Left;
ClientY = Y - WindowRect.Top;

// Ahora averiguamos si el objeto tiene padre, por ejemplo,
// si el objeto es un botón o una lista
Parent = GetAncestor(Window, GA_ROOT);

// Si el objeto no tiene padre, es que es una ventana. Si
// tiene padre (una ventana), utilizamos este, ya que el
// mensaje debe pasarse a una ventana.
if (Parent == 0) Parent = Window;

// Comprobamos que la ventana esta en primer plano, es decir,
// que es la ventana activa. Si no es así, la activamos
if (Parent < GetForegroundWindow() || Parent > GetForegroundWindow())
{
SetForegroundWindow(Parent);
}

// Y ahora le enviamos a la ventana los mensajes correspondientes
// para obtener un click del ratón
//SendMessage(Window, WM_LBUTTONDOWN, MK_LBUTTON, X);
//SendMessage(Window, WM_LBUTTONUP, 0, X);

SendMessage(Window,WM_LBUTTONDOWN,MK_LBUTTON,MAKELPARAM(ClientX,ClientY));
SendMessage(Window,WM_LBUTTONUP,MK_LBUTTON,MAKELPARAM(ClientX,ClientY));

 }
} 

tengo este codigo que parece estar bien, no da ningun error pero no pulsa el boton en la aplicacion que invoco (externa a Form1)(simular pulsado con SendMessage())

que puede pasar??? alguien lo sabe?

ecfisa 03-04-2017 17:37:09

Hola Snaked.

El código funciona bién, ¿ Seguro que el botón se encuentra en las coordenadas que indicas ?

Saludos :)

escafandra 03-04-2017 18:53:00

Cómo dice ecfisa debes tener claras las coordenadas.
Yo prefiero una simulación de cluck a bajo nivel:
Código PHP:

int MouseClick(int x, int y)
{
  
TPoint P;
  
GetCursorPos(&P); // Guardo las coordenadas del mouse

  
SetCursorPos(x, y);

  
INPUT Input[2];
    ::
ZeroMemory(Input, sizeof(Input));
  
Input[0].type = INPUT_MOUSE;
  
Input[0].mi.dx = x;
  
Input[0].mi.dy = y;
  
Input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;

  
Input[1].type = INPUT_MOUSE;
  
Input[1].mi.dx = x;
  
Input[1].mi.dy = y;
  
Input[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;
  
int a = SendInput(2, Input, sizeof(INPUT));

  
SetCursorPos(P.x, P.y); // Restauro las coordenadas del Mouse

  
return a;  // Retorno el número de eventos enviados
} 

Siendo X e Y coordenadas absolutas en pantalla.

Saludos.

Snaked 03-04-2017 21:17:44

gracias a los 2 por la rapida contestacion......

milagro milagro!!!.... el codigo de scafandra funciona a la perfeccion X-D

te debo unas tapitas y una cerveza escafandra......8)

Snaked 04-04-2017 00:50:55

y la pulsacion de una tecla del teclado??
 
he intentado hacer por mi cuenta la pulsacion de teclado pero me arroja un par de errores que dicen que espera un TagInput * en vez de TagInput

podriais revisar este codigo???

Cita:

INPUT Input;
Sleep(3000);

for(int cont = 0; cont < 8; cont++)
{
char TECLA;
TECLA = PIN[cont];

Input.type = INPUT_KEYBOARD;
Input.ki.wVk = 1; // Tecla a simular

// Presionar tecla
SendInput(1, &Input, sizeof(INPUT));

// Soltar tecla
Input.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &Input, sizeof(INPUT));

}

escafandra 04-04-2017 01:02:42

Revisa este tema donde publico una función que simula pulsación y liberación de teclas.

Saludos.

Snaked 04-04-2017 01:10:15

vale escafandra....ya lo he solucionado....posteo aqui el codigo correcto que me funciona

Código PHP:


INPUT Input
[1];

  
Input[0].type = INPUT_KEYBOARD;
  
Input[0].ki.wVk = VK_NUMPAD1; // Tecla a simular

  // Presionar tecla
  
SendInput(1, Input, sizeof(INPUT));

  
// Soltar tecla
  
Input[0].ki.dwFlags = KEYEVENTF_KEYUP;
  
SendInput(1, Input, sizeof(INPUT)); 


Snaked 04-04-2017 03:29:28

escafandra....el otro codigo que me has dado lo he convertido asi pero me da error de SendInput en los argumentos dice "cannot convert TagInput to TagInput * Type mismatch in pInputs , wanted TagINPUT * got TagINPUT"

Código PHP:

void SimKey(BYTE VK, bool Down)
{
 
TInput Input;

  
ZeroMemory(&Input, sizeof(Input));
  
Input.type = INPUT_KEYBOARD;
  
Input.ki.wVk = VK;
  
Input.ki.wScan = MapVirtualKey(VK, 0);
  
Input.ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
  if(!
Down) Input.ki.dwFlags = Input.ki.dwFlags || KEYEVENTF_KEYUP;
  
SendInput(1, tagINPUT(Input), sizeof(TInput));
} 


Snaked 04-04-2017 03:37:33

solucionado ya
 
vale, aqui esta el codigo funcionando

Código PHP:

void SimKey(BYTE VK, bool Down)
{
 
TInput Input;

  
ZeroMemory(&Input, sizeof(Input));
  
Input.type = INPUT_KEYBOARD;
  
Input.ki.wVk = VK;
  
Input.ki.wScan = MapVirtualKey(VK, 0);
  
Input.ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
  if(!
Down) Input.ki.dwFlags = Input.ki.dwFlags || KEYEVENTF_KEYUP;
  
SendInput(1, &Input, sizeof(Input));
} 



La franja horaria es GMT +2. Ahora son las 20:16:20.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi