CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Wciśnięcie klawisza w obcym programie

Wciśnięcie klawisza w obcym programie

dział ogólny

Re: Wciśnięcie klawisza w obcym programie

Nowy postprzez Corvis » wtorek, 16 września 2014, 09:25

Dołączyłem ten z SDK ale miałem błąd, że biblioteka jest uszkodzona. Zadziałało dopiero jak dołączyłem ten z C++ Builder-a. Czyli nie trzeba instalować SDK DX
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Wciśnięcie klawisza w obcym programie

Nowy postprzez polymorphism » wtorek, 16 września 2014, 09:31

Z tym instalowaniem to Ty wyskoczyłeś ;) Ja od początku pisałem, żebyś dołączył tę jedną bibliotekę (pierwsza odpowiedź na zgłoszenie problemu z kompilacją).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wciśnięcie klawisza w obcym programie

Nowy postprzez Mironas » wtorek, 16 września 2014, 09:42

Corvis napisał(a):Po dodaniu do projektu dinput8.lib jest:

[ilink32 Error] Error: 'C:\PROGRAM FILES (X86)\MICROSOFT DIRECTX SDK (JUNE 2010)\LIB\X86\DINPUT8.LIB' contains invalid OMF record, type 0x21 (possibly COFF)




Do konwersji plików LIB z formatu COFF na format OMF służy program coff2omf.exe wchodzący w skład środowiska.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Wciśnięcie klawisza w obcym programie

Nowy postprzez Corvis » wtorek, 16 września 2014, 09:59

Przynajmniej temat jest rozwiązany i jasny dla potomnych :-)
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Wciśnięcie klawisza w obcym programie

Nowy postprzez Corvis » wtorek, 16 września 2014, 14:10

Znalazłem jeszcze taką metodę symulacji klawiszy:

KOD cpp:     UKRYJ  
        INPUT ip;

         // Set up a generic keyboard event.
        ip.type = INPUT_KEYBOARD;
        ip.ki.wScan = 0; // hardware scan code for key
        ip.ki.time = 0;
        ip.ki.dwExtraInfo = 0;

        // Press the "A" key
        ip.ki.wVk = 0x41; // virtual-key code for the "a" key
        ip.ki.dwFlags = 0; // 0 for key press
        SendInput(1, &ip, sizeof(INPUT));

        // Release the "A" key
        ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release
        SendInput(1, &ip, sizeof(INPUT));
 


Ale muszę sprawdzić czy to zadziała z symulatorem.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Wciśnięcie klawisza w obcym programie

Nowy postprzez Corvis » wtorek, 16 września 2014, 14:54

Dobra pierwsze koty za płoty z DI na podstawie kursu:

http://courses.washington.edu/css450/20 ... torial.pdf

Stworzyłem testową aplikację która powinna pobrać status klawiszy z klawiatury. Jednak cały czas w TTimerze funkcja GetDeviceState zwraca błąd i cały czas jest Beep() ( co 1 sek chodzi timer )

KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender) {
        hr = fDIKeyboard->GetDeviceState( sizeof(fDIKeyboardState), (LPVOID)&fDIKeyboardState );

        if(FAILED(hr)) {
                Beep();
    }
}
 


tutaj cały kod

KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

#include <InitGuid.h>
#include <dinput.h>


//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

#pragma link "dinput8.lib"

TForm1 *Form1;

LPDIRECTINPUT8 fDI;
LPDIRECTINPUTDEVICE8 fDIKeyboard;
HWND m_hWnd;
HRESULT hr;

char fDIKeyboardState[256] = { 0x00 };
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender) {

        DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&fDI, NULL );

        if(fDI == NULL) {
                ShowMessage("Błąd inicjalizacji DI");
                this->Close();
                return;
        }

        // Create the connection to the keyboard device
        fDI->CreateDevice(GUID_SysKeyboard, &fDIKeyboard, NULL);

        if (fDIKeyboard == NULL) {
                ShowMessage("Błąd inicjalizacji KLAWIATURY");
                this->Close();
                return;
        } else {

                fDIKeyboard->SetDataFormat(&c_dfDIKeyboard);
                fDIKeyboard->SetCooperativeLevel(m_hWnd, DISCL_FOREGROUND | DISCL_EXCLUSIVE );
                fDIKeyboard->Acquire();

                Timer1->Enabled = true;
        }

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender) {
        if(fDIKeyboard) {
        fDIKeyboard->Unacquire();
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender) {
        hr = fDIKeyboard->GetDeviceState( sizeof(fDIKeyboardState), (LPVOID)&fDIKeyboardState );

        if(FAILED(hr)) {
                Beep();
    }
}
//---------------------------------------------------------------------------

 


Ma ktoś pomysł dlaczego tak jest ? ogólnie przykładów z tego w google jak na lekarstwo :/
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Wciśnięcie klawisza w obcym programie

Nowy postprzez polymorphism » wtorek, 16 września 2014, 17:09

A dałeś na początku programu wywołanie CoInitializeEx i CoUninitialize na końcu?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Wciśnięcie klawisza w obcym programie

Nowy postprzez Corvis » środa, 17 września 2014, 08:10

Faktycznie to pominąłem :? , ale teraz dodałem i dalej jest ten sam problem
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

#include <InitGuid.h>
#include <dinput.h>


//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

#pragma link "dinput8.lib"

TForm1 *Form1;

LPDIRECTINPUT8 fDI;
LPDIRECTINPUTDEVICE8 fDIKeyboard;
HWND m_hWnd;
HRESULT hr;

char fDIKeyboardState[256] = { 0x00 };

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
        CoInitializeEx(NULL, COINIT_MULTITHREADED);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender) {

        DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&fDI, NULL );

        if(fDI == NULL) {
                ShowMessage("Błąd inicjalizacji DI");
                this->Close();
                return;
        }

        // Create the connection to the keyboard device
        fDI->CreateDevice(GUID_SysKeyboard, &fDIKeyboard, NULL);

        if (fDIKeyboard == NULL) {
                ShowMessage("Błąd inicjalizacji KLAWIATURY");
                this->Close();
                return;
        } else {

                fDIKeyboard->SetDataFormat(&c_dfDIKeyboard);
                fDIKeyboard->SetCooperativeLevel(m_hWnd, DISCL_BACKGROUND | DISCL_EXCLUSIVE );
                fDIKeyboard->Acquire();

                Timer1->Enabled = true;
        }

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender) {
        if(fDIKeyboard) {
                fDIKeyboard->Unacquire();
        }

        CoUninitialize();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender) {
        hr = fDIKeyboard->GetDeviceState( sizeof(fDIKeyboardState), (LPVOID)&fDIKeyboardState );

        if(FAILED(hr)) {
                Beep();
        }
}
//---------------------------------------------------------------------------

 


Funkcja
KOD cpp:     UKRYJ  
CoInitializeEx(NULL, COINIT_MULTITHREADED);


zwraca mi: RPC_E_CHANGED_MODE co znaczy z tego co wyczytałem, że biblioteka jest już zainicjalizowana ? hmm :?:
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Wciśnięcie klawisza w obcym programie

Nowy postprzez polymorphism » środa, 17 września 2014, 09:52

Chodzi o to, że COM jest już zainicjowane, ale z innym modelem współbieżności. Wątek główny powinien mieć model COINIT_APARTMENTTHREADED, pozostałe wątki COINIT_MULTITHREADED (choć mogą być wyjątki od tej reguły).

Co do analizy błędów COM-a. Sam Beep niewiele mówi, sprawdzaj kody zwróconych błędów, one są dość pomocne.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wciśnięcie klawisza w obcym programie

Nowy postprzez Corvis » środa, 17 września 2014, 12:30

1. Po zmianie na COINIT_APARTMENTTHREADED funkcja zwraca S_FALSE
2. Odczytałem błąd zwracany przez fDIKeyboard->GetDeviceState jest to DIERR_NOTACQUIRED
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Wciśnięcie klawisza w obcym programie

Nowy postprzez polymorphism » środa, 17 września 2014, 12:47

  1. I dobra. S_FALSE to nie jest błąd, mówi tyle, że COM został już wcześniej zainicjowany.
  2. w takim razie sprawdź, co zwraca IDirectInputDevice8::Acquire.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Wciśnięcie klawisza w obcym programie

Nowy postprzez Corvis » środa, 17 września 2014, 12:50

Właśnie to zrobiłem:

fDIKeyboard->SetCooperativeLevel(this->Handle, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE ); zwraca DI_OK
fDIKeyboard->SetDataFormat(&c_dfDIKeyboard); zwraca DI_OK
fDIKeyboard->Acquire(); zwraca DIERR_INVALIDPARAM

No to tutaj jest problem teraz tylko pytanie dlaczego
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Wciśnięcie klawisza w obcym programie

Nowy postprzez polymorphism » środa, 17 września 2014, 13:00

Spróbuj bez flagi DISCL_NONEXCLUSIVE a z DISCL_EXCLUSIVE. Ewentualnie zmień kolejność wywołań SetCooperativeLevel i SetDataFormat.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Wciśnięcie klawisza w obcym programie

Nowy postprzez Corvis » środa, 17 września 2014, 13:06

Wtedy SetCooperativeLevel, SetDataFormat zwracają wartość: -2147467263L (0x80004001) co jest błędem. Staram się przegrzebać prez przykłady ale tego jak na lekarstwo jest :D
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Wciśnięcie klawisza w obcym programie

Nowy postprzez polymorphism » środa, 17 września 2014, 13:55

U mnie, to znaczy w aplikacji konsolowej, ten kod w zasadzie działa. Czasem SetCooperativeLevel zwraca błąd, ale nie wiem czy to nie jest efekt tego, że za okno robi mi pulpit. Tak czy siusiak klawiaturę czyta.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Poprzednia stronaNastępna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 12 gości