|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
[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. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Spiegati meglio.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
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
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
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
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Quote:
|
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
che me ne faccio di quel file senza estensione?
cosa devo includere nel codice? |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Codice:
make -f makeKbUtil
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Se ho capito bene, hai bisogno di muovere il mouse in base alla pressione dei tasti della tastiera. Giusto?
Ecco: Codice:
#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;
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
sono su win, non su linux
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
'azz ... scusa allora io proprio sono il meno adatto ciao
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
per la MouseMove non oso immaginarlo
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
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 |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Dovresti usare la gestione ad "eventi" di Windows all'interno di una finestra. Allora puoi avere questa informazione.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
ma come mai quando facevo input.mi.dx-- non funzionava?
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
input.mi.dy--; input.mi.dwFlags=MOUSEEVENTF_MOVE; Ma come hai impostato inizialmente questi valori dx/dy???
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
ti posto il codice intero finora:
Codice:
#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
}
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
non funziona la rotellina... questa è la parte di codice che la riguarda:
Codice:
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; |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Ci sono 2 cose che vorrei verificare bene (lo farò magari stasera a casa, il mouse che ho in ufficio non ha la rotellina - 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!
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:16.











'azz ... scusa








