Witam. Skleciłem program do wysyłania określonego klawisza, do określonej aplikacji. Kod przedstawiam poniżej.
Natknąłem się na dwa problemy:
-
Po pobraniu uchwytu okna, pobieram nazwę okna. Problem jest w tym, że mogę ją pobrać tylko raz, po zmianie piosenki nazwa okna zmienia się, i za chiny nie mogę jej znów pobrać. Co może być tego przyczyna, w końcu pobieram nazwę głównego okna?
-
Podobnie jak u góry, mogę wysłać tylko jeden klawisz na początku, jak aplikacja wystartuje np. wysyłam klawisz play. Później, po zmianie piosenki ręcznie w aplikacji docelowej, program jakby gubił uchwyt. Dodam, że wciąż mogę wyciągać okno z pod spodu funkcja SetForegroundWindow(), mimo tego że już nie odpowiada na klawisze.
Ogólnie chciałem zrobić aplikacje sterującą dowolna aplikacja multimedialna, chodzi mi główne o funkcje play, stop, back, next itp. Ma to być uniwersalne tak, aby użytkownik dostosował sobie to do ulubionego odtwarzacza. Z góry dziękuje za pomoc.
#define _WIN32_WINNT 0x500
#include <windows.h>
#define _WIN32_IE 0x0300
#include <stdio.h>
#include <tchar.h>
#include <psapi.h>
/* zaporzyczone funkcje do otrzymania uchytu okna z procesu*/
struct StrukturaPomocnicza
{
unsigned long identyfikatorSzukanegoProcesu;
HWND uchwytSzukanegoOkna;
};
int __stdcall ZbadajOkno(HWND uchwytBadanegoOkna,LPARAM lParam)
{
StrukturaPomocnicza* wskaznik=(StrukturaPomocnicza*)lParam;
unsigned long identyfikatorSzukanegoProcesu=wskaznik->identyfikatorSzukanegoProcesu;
unsigned long identyfikatorBadanegoProcesu;
GetWindowThreadProcessId(uchwytBadanegoOkna,&identyfikatorBadanegoProcesu);
if (identyfikatorSzukanegoProcesu==identyfikatorBadanegoProcesu)
{
wskaznik->uchwytSzukanegoOkna=uchwytBadanegoOkna;
return false;
}
return true;
}
HWND GetMainWindowHandle(unsigned long ProcessId)
{
StrukturaPomocnicza daneSzukanegoOkna;
daneSzukanegoOkna.identyfikatorSzukanegoProcesu=ProcessId;
daneSzukanegoOkna.uchwytSzukanegoOkna=0;
StrukturaPomocnicza* wskaznik=&daneSzukanegoOkna;
EnumWindows((WNDENUMPROC)&ZbadajOkno,(LPARAM)wskaznik);
return daneSzukanegoOkna.uchwytSzukanegoOkna;
}
void PrintProcessNameAndID( DWORD processID )
{
TCHAR szProcessName[ MAX_PATH ] = TEXT( "<nie znany>" );
HWND okno;
int cTxtLen;
PSTR pszMem;
INPUT *key;
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, processID );
if ( NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;
if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
&cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName,
sizeof(szProcessName)/sizeof(TCHAR) );
}
}
//odszukanie danego procesu wedlug nazwy
if(strcmp(szProcessName,"foobar2000.exe") == 0)
{
_tprintf( TEXT("%s (PID: %u)\n"), szProcessName, processID );
okno = GetMainWindowHandle(processID); // pobranie uchytu okna z procesu
cTxtLen = GetWindowTextLength(okno); // pobranie dlugosci nazwy okna
// alokowanie pamieci na nazwe
pszMem = (PSTR) VirtualAlloc((LPVOID) NULL,
(DWORD) (cTxtLen + 1), MEM_COMMIT,
PAGE_READWRITE);
GetWindowText( okno, pszMem, cTxtLen + 1 ); // poobranie nazwy i zapisanie w pszMem
printf("%s", pszMem); // wyswietlenie nazwy
SetForegroundWindow( okno ); // ustawienie zaslonientego okna jako aktywne
Sleep(100);
//keybd_event('P', 0, 0, 0); //wyslanie klawisza P
// tak sama tylko przy uzyciu SendInput()
key = new INPUT;
key->type = INPUT_KEYBOARD;
key->ki.wVk = 0x50;
key->ki.dwFlags = 0;
key->ki.time = 0;
key->ki.wScan = 0;
key->ki.dwExtraInfo = 0;
SendInput(1,key,sizeof(INPUT));
key->ki.dwExtraInfo = KEYEVENTF_KEYUP;
SendInput(1,key,sizeof(INPUT));
}
CloseHandle( hProcess );
}
int main( )
{
DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;
// pobranie listy procesow
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
return true;
cProcesses = cbNeeded / sizeof(DWORD); // Obliczanie ile procesow otrzymano
// Szukanie danego prcesu
for ( i = 0; i < cProcesses; i++ )
{
if( aProcesses[i] != 0 )
{
PrintProcessNameAndID( aProcesses[i] );
}
}
return 0;
}