symulowanie wciśnięcia klawisza

0

witam! Uczę się c++ do ok 1,5 miecha początki są mozolne

napisałem program, który po wpisaniu textu do konsoli odpala notatnik systemowy i przepisuje tam ten text.Zaznaczam że nie chodzi mi o zapisywanie do pliku gdyż od tego jest <fstream>. Mój kod generalnie działa ale...
gdy do konsoli wpiszę np "kot" w notatniku ląduje ten sam wyraz małymi literami, i jest ok to samo dotyczy dużych litrer >problem pojawia się gdy chcę napisać "koT"
wtedy program używa wyłącznie dużych liter i wynik w notatniku to"KOT" .Nie wiem gdzie tkwi błąd
zależy mi aby program odróżniał znaki z shiftem i bez shifta Gdyby ktoś z bardziej doświadczonych kolegów mogł mi pomóc będe wdzięczny
na razie używam dev`a

 </
#include <windows.h>             
#include <cstdio>               
#include <iostream>
#include <winable.h>

using namespace std;
int main()
{ 
string A;
getline(cin,A) ;
int a=A.size();
 
char *B=new char[a];

strncpy(B, A.c_str(), a+1);  

bool k=false;

// poniżej wartości char klawiatury które wchodzą z shiftem
int shift[]={33,34,35,36,37,38,40,41,42,43,58,60,62,63,64,65,66,67,68,69,70,71,72,73,
74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,94,123,124,125};


for (int i=0;i<=a;++i)//sprawdzamy czy zastosować "keybd_event(VK_SHIFT, 0, 0, 0);"
    
     
	     {
	        for(int j=0;j<=45;++j)
	 
	      if ((int)B[i]==shift[j])
	        
			k=true;	
         }
         
     


for (int i=0;i<=a;++i)	
cout<<(int)B[i]<<" ";   //pomocnicze wypisywanie asci
 

system("start notepad");Sleep(500); //odpalamy notatnik
						    

         for (int i=0;i<=a;++i)						   
       {			   
             if(k)
	keybd_event(VK_SHIFT, 0, 0, 0);  //SHIFT (1) 
			    
             keybd_event(VkKeyScan(B[i]), 0, 0, 0);Sleep(500);  //klawisz  (1)
             
	 if(k)
             keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);                                                                          //SHIFT
         
		     keybd_event(VkKeyScan(B[i]), 0, KEYEVENTF_KEYUP, 0);  //klawisz  (0)
		     
			 
        
       }
                  
keybd_event(VK_BACK, 0, 0, 0);                     //zmzuje oatatni niepotrzebny znak(1)
keybd_event(VK_BACK, 0, KEYEVENTF_KEYUP, 0);		//zmzuje oatatni niepotrzebny znak(0)				    
						
						
                      



system("PAUSE");
delete B;

return 0;
}>
```cpp

1

if(k)

k? co to jest k? nazywaj zmienne normalnie…

Raczej najpierw należy puścić literę, a potem shifta.

poza tym po co jest to „zmzuje oatatni niepotrzebny znak”?

0

Znajdz sobie uchwyt do Edytora i przesylaj za pomoca

SendMessage(hEdit,WM_CHAR,letter,0);

letter to po prostu zwykly char.

0
Azarien napisał(a):

if(k)

k? co to jest k? nazywaj zmienne normalnie…

Raczej najpierw należy puścić literę, a potem shifta.

poza tym po co jest to „zmzuje oatatni niepotrzebny znak”?

odnośnie "bool k " 100% racji -moje bałaganiarstwo & niechlujstwo!!!!!!!!!!!!!!!!!!!!!!!!!!!
a co do zmazywania ostatniego niepotrzebnego znaku: gdyby tego nie było to do wpisanego textu dodawałoby jakiś śmieć na końcu. Chyba chodzi o to że string czy tablica charów ma o jeden znak więcej niż własna długość (chyba zero na końcu)przypomniałem sobie o tym dopiero po napisaniu kodu.
Co do puszczenia najpierw litery a potem szifta próbowałem na dwóch różnych kompach i nic -dalej to samo.
Przerabiałem też inne warianty przy puszczaniu shifta nie dawałem "if(k)" ,próbowałem też dodać if(!k) + samo wciśnięcie i odpuszczenia klawisza i alternatywnie z "else" - Dalej lipa.

0
#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;
}

Do notatnika systemowego. Na forum temat byl i wlasnie to rozwiazanie dalem. Przeslaniem konkretnego chara zajmuje sie SendMessage zamiast bawic sie w takie kiepskie przesylanie do aktywnej aplikacji, lepiej bezsporednio do okna procesu.

0
Krycho napisał(a):

Znajdz sobie uchwyt do Edytora i przesylaj za pomoca

SendMessage(hEdit,WM_CHAR,letter,0);

letter to po prostu zwykly char.

obawiam się że to jeszcze nie mój poziom ale przymierzam się wkrótce do win api Przynajmniej będę wiedział jak podejść do problemu thanks

0

NO i problem rozwiązałem !!!!!!!!!
trzeba było zamiast jednego boola wprowadzić tablice dynamiczną booli o wymiarach przyjmowanego textu .W poprzedniej wersji bool x dobrze działało do momentu gdy został użyty klawisz shift (choćby 1 raz) gdy tak sie stało program dostawał wartość true dla całości i pisał wszystko jak z shiftem . Tablica booli sprawdza kolejno dla każdego znaku czy wcisnąć (symulować shift czy nie). Może to się komuś przyda gdy będzie potrzebował porównać zgodność znaków w 2 tablicach o róznych rozmiarach bo problem z działaniem kodu właśnie do tego się sprowadzał.

Pomimo słusznej uwagi Azariena "bool x " zostawiam :) na pamiątkę że dałem rade problem
rozwiązać
:}

<code class="cpp"> </using namespace std;
int main()
{ 
string A;
getline(cin,A) ;
int a=A.size();
 
char *B=new char[a];
strncpy(B, A.c_str(), a);  

bool *x=new bool[a];   
for (int i=0;i<=a;++i)
x[i]=false;


int shift[]={33,34,35,36,37,38,40,41,42,43,58,60,62,63,64,65,66,67,68,69,70,71,72,73,
74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,94,123,124,125};


for (int i=0;i<=a;++i)//sprawdzamy czy zastosować "keybd_event(VK_SHIFT, 0, 0, 0);"
    
     
	     {
	        for(int j=0;j<=46;++j)
	 
	      if ((int)B[i]==shift[j])
	        
			x[i]=true;	
         }
         
     
for (int i=0;i<=a;++i)	
cout<<(int)B[i]<<" ";   
 

system("start notepad");Sleep(500); 
						    

         for (int i=0;i<=a-1;++i)						   
       {			   
             if(x[i])
			 keybd_event(VK_SHIFT, 0, 0, 0);  
			    
             keybd_event(VkKeyScan(B[i]), 0, 0, 0);Sleep(500);  
             
			 if(x[i])
             keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);                             
		     keybd_event(VkKeyScan(B[i]), 0, KEYEVENTF_KEYUP, 0);  
       }
                  


system("PAUSE");
delete B;
delete x;
return 0;
}>

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