Symulacja naciśnięcia klawisza a.

0
#ifndef UNICODE
#define UNICODE
#endif

#include <Windows.h>

int main()
{
	int xPos;
	int yPos;
	

	POINT currentCoordinates;
	
		
		Sleep(5000);
		hCurrentWindow = GetForegroundWindow();
			
		GetCursorPos(&currentCoordinates);

		
		SendMessage(hCurrentWindow,WM_LBUTTONDOWN,MK_LBUTTON,MAKELONG(currentCoordinates.x,currentCoordinates.y));
	

		SendMessage(hCurrentWindow,WM_KEYDOWN,'a',1);

		
	
system("PAUSE");
return 0;

}

Owszem kompiluje się, wykonanie programu po 5 sekundach dochodzi do końcowej pauzy. Ale po drodze nic się nie dzieje, mimo że w ciągu tych 5 sekund otwieram notatnik, nie pojawia tam się ani jedna literka 'a'. Wiem, sprawdzałem, uchwyt notatnika pobiera się prawidłowo. Gdzie w takim razie tkwi szkopuł?

2

u mnie w przypadku notatnika nie działała symulacja klawiszy jeśli brałem uchwyt od całego okna i działało dopiero gdy pobierałem uchwyt kontrolki w której wpisuje się tekst, nie wiem czy zwróciłeś na to uwagę.
przykład w pythonie :P (sorki ze nie ten jezyk, ale funkcja przecież takie same, więc nie chce mi sie przepisywać :P )

h = win32gui.FindWindow(None, "README.txt - Notatnik")
h = win32gui.FindWindowEx(h, None, "Edit", None)
win32api.SendMessage(h, win32con.WM_CHAR, 85, 0)

ps. fajne jest to że ten sposób działa nawet wtedy gdy notatnik jest zminimalizowany :)

Co do Twojej metody dodaj puszczanie przycisku myszy i klawisza. Klikasz przyciskiem myszy i go nie puszczasz a potem wciskasz klawisz A .. sprawdz co się stanie gdy tak zrobisz w notatniku ;)

0

Ok , dodałem funkcję puszczającą lewy klawisz myszy

 
#ifndef UNICODE
#define UNICODE
#endif

#include <Windows.h>

int main()
{
	
	HWND hCurrentWindow;

	

	POINT currentCoordinates;
	
		
		Sleep(5000);
		hCurrentWindow = GetForegroundWindow();
			
		GetCursorPos(&currentCoordinates);

		
		SendMessage(hCurrentWindow,WM_LBUTTONDOWN,MK_LBUTTON,MAKELONG(currentCoordinates.x,currentCoordinates.y));
		SendMessage(hCurrentWindow,WM_LBUTTONUP,NULL,MAKELONG(currentCoordinates.x,currentCoordinates.y));  //NOWOŚĆ!!!!

		
		SendMessage(hCurrentWindow,WM_KEYDOWN,0x41,0);

		
	
system("PAUSE");
return 0;

}



Nic się nie zmieniło. Może dlatego, że wstawiłem NULL jako wParam? Z drugiej strony nie mam pojęcia co innego by pasowało...

http://msdn.microsoft.com/en-us/library/windows/desktop/ms645608%28v=vs.85%29.aspx

Ps. O dziwo działa w edytorze tekstu Visual Studio. Czyżby notatnik miał jakieś magiczne właściwości? :/
Ps2. Zauważyłem, że literka wklepuje się linijkę/dwie pod obecnym położeniem kursora. Czyżbym nieprawidłowo pobrał współrzędne?

1

współrzędne pewnie powinny być podane względem lewego górnego rogu okna do którego SendMessage jest wysyłany a Ty podajesz względem rogu ekranu

w wParam dla WM_LBUTTONUP mam to samo co dla WM_LBUTTONDOWN tzn. MK_LBUTTON a nie null

1

Podawane sa wzgledem lewego gornego rogu ekranu nie okna.

0

Chyba to pobieranie współrzędnych nie jest jedynym błędem. Popatrzmy na taki kod:

 
#ifndef UNICODE
#define UNICODE
#endif

#include <Windows.h>

int main()
{
	
	HWND hCurrentWindow;

	
		
		Sleep(5000);
		hCurrentWindow = GetForegroundWindow();
			
		

		
		SendMessage(hCurrentWindow,WM_KEYDOWN,0x41,0);

		
	
system("PAUSE");
return 0;

}



Tutaj też notepad nie pozwala sobie wklepać literki a. W Firefox'ie i VS text editor dalej nie ma problemów.

1
#include <windows.h>
#include <psapi.h>
#include <iostream>
#include <conio.h>

using namespace std;

#pragma comment(lib, "Psapi.lib")
#pragma comment(lib, "user32.lib")

wstring getProcessName( DWORD processID )
{
    wchar_t ProcessName[MAX_PATH] = L"Unknown";
    wstring name;

    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                   PROCESS_VM_READ,
                                   FALSE, processID );

    if (NULL != hProcess )
    {
        HMODULE hMod;
        DWORD pSize;

        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &pSize) )
        {
            GetModuleBaseName( hProcess, hMod, ProcessName, sizeof(ProcessName)/sizeof(TCHAR) );
        }
    }

    CloseHandle( hProcess );

    name = ProcessName;
    return name;
}

HWND getHWND(DWORD dwPID)
{
    HWND Hwnd = GetTopWindow(0);
    HWND hWnd = 0;
    DWORD pid;

    while(Hwnd)
    {
        GetWindowThreadProcessId(Hwnd, &pid);
        if(pid == dwPID) hWnd = Hwnd;
        Hwnd = GetNextWindow(Hwnd, GW_HWNDNEXT);
    }

    return hWnd;
}

int main( )
{
    DWORD pTab[1024], pSize, pCount, NotepadID;
    HWND hNotepad;

    if (!EnumProcesses( pTab, sizeof(pTab), &pSize )) return 1;

    pCount = pSize / sizeof(DWORD);

    for (int i = 0; i < pCount; i++)
    {
        if( getProcessName(pTab[i]).compare(L"notepad.exe") == 0)
        {
            NotepadID = pTab[i];
            break;
        }
    }
    hNotepad = getHWND(NotepadID);

    HWND hEdit = FindWindowEx(hNotepad,0,L"Edit",0);
    char letter = 0;
    if(hEdit != NULL)
    {
        cout << "Click ESC to end.\n";
        while(true)
        {

            letter = getch();
            if(letter==27)break;
            cout << letter;
            SendMessage(hEdit,WM_CHAR,letter,0);
        }
    }
    else cout << "Nie znaleziono procesu.\n";
    return 0;
}

Nie chcialo mi sie komentowac. Jak czegos nie wiesz to pisz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1