View Full Version : [C++] getch anche fuori dalla finestra di DOS
Sto lavorando a un programma di mouse su tastiera (tipo tast su skermo, ma al contrario) e mi servirebbe sapere come usare getch anche se i tasti vengono premuti avendo selezionato una finestra diversa da quella di dos.
grazie in anticipo.
Sto lavorando a un programma di mouse su tastiera (tipo tast su skermo, ma al contrario) e mi servirebbe sapere come usare getch anche se i tasti vengono premuti avendo selezionato una finestra diversa da quella di dos.
grazie in anticipo.Non è molto chiaro. getch (così come le altre funzioni standard di I/O come getchar, printf, ecc... lavorano con una "console", non con una finestra qualunque di Windows.
Spiegati meglio.
praticamente dovrebbe funzionare tipo keylogger, solo che anziche salvare i tasti premuti su un file, li usa in uno switch che decide dove far muovere il mouse
trallallero
23-08-2006, 15:40
Sto lavorando a un programma di mouse su tastiera (tipo tast su skermo, ma al contrario) e mi servirebbe sapere come usare getch anche se i tasti vengono premuti avendo selezionato una finestra diversa da quella di dos.
grazie in anticipo.
se ho capito bene hai lo stesso problema che avevo io.
Prova questo che ho fatto e se hai domande falle qui perché c'é altra gente che ti puó aiutare, magari io sto a casa e non mi connetto.
C'é anche il make che ti crea la libreria ma non ho tempo per cambiartelo o per spiegartelo adesso.
Ciao :)
trallallero
23-08-2006, 15:42
praticamente dovrebbe funzionare tipo keylogger, solo che anziche salvare i tasti premuti su un file, li usa in uno switch che decide dove far muovere il mouse
ti serve un getch che risponda direttamente al tasto senza l'enter no ?
ti serve un getch che risponda direttamente al tasto senza l'enter no ?
esatto
che me ne faccio di quel file senza estensione?
cosa devo includere nel codice?
trallallero
23-08-2006, 15:52
che me ne faccio di quel file senza estensione?
cosa devo includere nel codice?
make -f makeKbUtil
io tra un attimo me ne vado, mi spiace. Ma andbin (se vuole :D ) ha piú esperienza di me ;)
Se ho capito bene, hai bisogno di muovere il mouse in base alla pressione dei tasti della tastiera. Giusto?
Ecco:
#define STRICT
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#define KEY_ESCAPE 0x1B
#define KEY_X_UP 0x48
#define KEY_X_DOWN 0x50
#define KEY_X_LEFT 0x4B
#define KEY_X_RIGHT 0x4D
void MoveMouse (int dx, int dy)
{
INPUT input;
ZeroMemory (&input, sizeof (INPUT));
input.type = INPUT_MOUSE;
input.mi.dx = dx;
input.mi.dy = dy;
input.mi.dwFlags = MOUSEEVENTF_MOVE;
SendInput (1, &input, sizeof (INPUT));
}
int main (void)
{
int ch, ch2;
do {
ch = getch ();
if (ch == 0x00 || ch == 0xE0)
{
ch2 = getch ();
if (ch2 == KEY_X_UP)
MoveMouse (0, -1);
else if (ch2 == KEY_X_DOWN)
MoveMouse (0, +1);
else if (ch2 == KEY_X_LEFT)
MoveMouse (-1, 0);
else if (ch2 == KEY_X_RIGHT)
MoveMouse (+1, 0);
}
} while (ch != KEY_ESCAPE);
return 0;
}
Basta usare le frecce della tastiera e il mouse si muove. :cool:
sono su win, non su linux :(
trallallero
23-08-2006, 15:55
sono su win, non su linux :(
:doh: 'azz ... scusa :D
allora io proprio sono il meno adatto :D
ciao
trallallero
23-08-2006, 16:00
Basta usare le frecce della tastiera e il mouse si muove :cool:
antiquati come al solito ... su Sun con sole 600 righe di codice fai la funzione getch() :O
per la MouseMove non oso immaginarlo :rolleyes:
esiste anche un sistema per determinare fin quando un tasto è premuto, e generare eventi quando il tasto viene premuto e quando viene rilasciato?
mi serve per simulare il tasto premuto
esiste anche un sistema per determinare fin quando un tasto è premuto, e generare eventi quando il tasto viene premuto e quando viene rilasciato?
mi serve per simulare il tasto premutoCon la getch non puoi avere l'informazione tasto premuto/rilasciato.
Dovresti usare la gestione ad "eventi" di Windows all'interno di una finestra. Allora puoi avere questa informazione.
ma come mai quando facevo input.mi.dx-- non funzionava?
ma come mai quando facevo input.mi.dx-- non funzionava?Tu hai usato:
input.mi.dy--;
input.mi.dwFlags=MOUSEEVENTF_MOVE;
Senza specificare MOUSEEVENTF_ABSOLUTE, il valori in dx/dy indicano un movimento relativo e non assoluto.
Ma come hai impostato inizialmente questi valori dx/dy???
ti posto il codice intero finora:
#define KEY_ESCAPE 0x1B
#define KEY_X_UP 0x48
#define KEY_X_DOWN 0x50
#define KEY_X_LEFT 0x4B
#define KEY_X_RIGHT 0x4D
#define STRICT
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
BOOL func(CHAR mov)
{
INPUT input;
ZeroMemory (&input, sizeof (INPUT));
input.type=INPUT_MOUSE;
switch(mov)
{
case '7'://UL
input.mi.dx--;
input.mi.dy--;
input.mi.dwFlags=MOUSEEVENTF_MOVE;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
break;
case '8'://U
input.mi.dy--;
input.mi.dwFlags=MOUSEEVENTF_MOVE;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
break;
case '9'://UR
input.mi.dx++;
input.mi.dy--;
input.mi.dwFlags=MOUSEEVENTF_MOVE;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
break;
case '4'://L
input.mi.dx--;
input.mi.dwFlags=MOUSEEVENTF_MOVE;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
break;
case '6'://R
input.mi.dx++;
input.mi.dwFlags=MOUSEEVENTF_MOVE;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
break;
case '1'://DL
input.mi.dx--;
input.mi.dy++;
input.mi.dwFlags=MOUSEEVENTF_MOVE;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
break;
case '2'://D
input.mi.dy--;
input.mi.dwFlags=MOUSEEVENTF_MOVE;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
break;
case '3'://DR
input.mi.dx++;
input.mi.dy++;
input.mi.dwFlags=MOUSEEVENTF_MOVE;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
break;
case KEY_X_DOWN://wheel down
input.mi.mouseData--;
input.mi.dwFlags=MOUSEEVENTF_WHEEL;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
break;
case KEY_X_UP://wheel up
input.mi.mouseData++;
input.mi.dwFlags=MOUSEEVENTF_WHEEL;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
break;
case KEY_X_LEFT://left button click
input.mi.dwFlags=MOUSEEVENTF_LEFTDOWN;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
input.mi.dwFlags=MOUSEEVENTF_LEFTUP;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
break;
case KEY_X_RIGHT://right button click
input.mi.dwFlags=MOUSEEVENTF_RIGHTDOWN;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
input.mi.dwFlags=MOUSEEVENTF_RIGHTUP;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
break;
case '/'://left button hold;
input.mi.dwFlags=MOUSEEVENTF_LEFTDOWN;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
break;
case '*'://right button hold
input.mi.dwFlags=MOUSEEVENTF_RIGHTDOWN;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
break;
case '-'://button relase
input.mi.dwFlags=MOUSEEVENTF_RIGHTUP;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
input.mi.dwFlags=MOUSEEVENTF_LEFTUP;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
break;
}
return TRUE;
}
void MoveMouse (int dx, int dy)
{
INPUT input;
ZeroMemory (&input, sizeof (INPUT));
input.type = INPUT_MOUSE;
input.mi.dx = dx;
input.mi.dy = dy;
input.mi.dwFlags = MOUSEEVENTF_MOVE;
SendInput (1, &input, sizeof (INPUT));
}
int main ()
{
//ci sto lavorando
}
ti posto il codice intero finora:
:eek: un pochino lunghetto.
Comunque ho capito: nella funzione azzeri la struttura INPUT e poi incrementi/decrementi dx/dy per avere +1 o -1.
Ma a questo punto ti conviene usare la funzione MoveMouse come ho fatto io, passando -1, 0, +1. ;)
non funziona la rotellina... questa è la parte di codice che la riguarda:
case KEY_X_DOWN://wheel down
input.mi.mouseData--;
input.mi.dwFlags=MOUSEEVENTF_WHEEL;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
break;
case KEY_X_UP://wheel up
input.mi.mouseData++;
input.mi.dwFlags=MOUSEEVENTF_WHEEL;
input.mi.time=0;
SendInput(1,&input,sizeof(INPUT));
break;
ho fatto lo stesso errore di prima?
non funziona la rotellina... questa è la parte di codice che la riguarda:
ho fatto lo stesso errore di prima?Tecnicamente mi sembra ok. MSDN dice di specificare MOUSEEVENTF_WHEEL e di mettere l'indicazione del movimento in mouseData.
Ci sono 2 cose che vorrei verificare bene (lo farò magari stasera a casa, il mouse che ho in ufficio non ha la rotellina :mad: azz che rottura):
- Forse muovere di -1/+1 è poco. Sempre MSDN dice: One wheel click is defined as WHEEL_DELTA, which is 120.
- C'è un'altra considerazione da fare: l'effetto della rotellina si manifesta nella finestra che ha il focus. Se stai lavorando con un browser, devi avere il cursore sulla finestra del browser (che deve avere il focus) e allora la rotellina ti permette di scrollare il documento.
Ma se l'applicazione che ha il focus è la tua che sta prendendo in input i tasti .... credo che non funzioni!
il problema è che se seleziono il browser i tasti ke premo non vengono piu riconosciuti dalla finestra di dos :muro:
il problema è che se seleziono il browser i tasti ke premo non vengono piu riconosciuti dalla finestra di dos :muro:Appunto ... :asd:
Quello che bisognerebbe fare è una applicazione Win32 GUI (non di tipo console) che usa un hook di tastiera per ricevere le informazioni sui tasti premuti a livello globale. Vedere la funzione Win32 SetWindowsHookEx.
che cos'è GUI?
devo riscrivere il codice daccapo? :eek: :eek:
ehm, scusate... Start -> Impostazioni -> Pannello di Controllo -> Accesso Facilitato -> Mouse -> Usa Controllo Puntatore; o sono io che non c'ho capito na mazza? :fagiano: :fagiano: :fagiano:
non credevo esistesse :cry:
la microsoft mi ha copiato :sofico:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.