W tym celu po kliknięciu przycisku minimalizuję aplikację i w timerze czekam na kliknięcie na formatce w obcym programie. Po kliknięciu pobieram uchwyt do tej formatki i próbuję na niej 'pisać' symulując wciskanie klawiszy.
Poniższy kod na jednych programach działa poprawnie, a na innych powoduje dziwne reakcje - tak jakby wciskano skróty klawiszowe. Np jeśli we wpisywanym tekście jest litera p to w przeglądarce Chrome otwiera się strona pomocy.
Próbowałem symulować klawisze za pomocą keybd_event oraz SendMessage ale w obu wariantach wyniki są beznadziejne.
Czy ktoś ma lepszy pomysł jak wstawić tekst do formatki w obcym programie?
Oto przykładowy kod (Timer1->Interval ustawić na małą wartość - np 50ms):
{
WindowState = wsMinimized;
Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if ( GetAsyncKeyState(VK_LBUTTON) )
{
Timer1->Enabled = false;
// komponent pod myszką
HWND hWnd = WindowFromPoint(Mouse->CursorPos);
// wstawienie testu do komponentu
WstawTekst(hWnd, Edit1->Text);
WindowState = wsNormal;
SetForegroundWindow( this->Handle );
}
}
//---------------------------------------------------------------------------
void TForm1::WstawTekst(HWND hWnd, String tekst)
{
int znak;
for (int i=1 ; i<=tekst.Length() ; i++)
{
znak = tekst[i];
// wariant 1
//keybd_event(znak, 0, 0, 0);
//keybd_event(znak, 0, KEYEVENTF_KEYUP, 0);
// wariant 2
SendMessage(hWnd, WM_KEYDOWN, znak, 0);
SendMessage(hWnd, WM_CHAR, znak, 0);
SendMessage(hWnd, WM_KEYUP, znak, 0);
Application->ProcessMessages();
}
}
//---------------------------------------------------------------------------