Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[cpp] Symulacja klawisza i wpisanie w nieaktywne okno


Rekomendowane odpowiedzi

Opublikowano

Witam, mam problem

Jak można wpisać klawisz/ symulować naciśnięcie PPM itp. w nieaktywnym/zminimalizowanym oknie?

Próbowałem i SendMessage i PostMessage, ale nei działa.

Opublikowano

No, napisałem PostMessage, zaraz sprawdze z ustawieniem akt okna.

 

Hmm, nie dziala

SetActiveWindow(okno);
PostMessage(okno,WM_KEYDOWN,0x50,5);
PostMessage(okno,WM_KEYUP,0x50,5);

Opublikowano

Korzystaj z MSDNu albo przestań się tym zajmować.

 

SetActiveWindow:

The window must be attached to the calling thread's message queue.

 

Aby dołączyć okno do swojego msg queue skorzystaj z AttachThreadInput

 

Następnie, przeczytaj o PostMessage i WM_KEYDOWN ( i odpowiednio UP ) gdyż całkowicie nieprawidłowo uzupełniasz lParam.

 

Tak to, mniej więcej, robi AutoIt:

scan = MapVirtualKey(vk, 0);

// Build the generic lparam to be used for WM_KEYDOWN/WM_KEYUP/WM_CHAR
lparam = 0x00000001 | (LPARAM)(scan << 16);         // Scan code, repeat=1
if (bForceExtended == true || IsVKExtended(vk) == true)
   lparam = lparam | 0x01000000;       // Extended code if required

if ( (m_nKeyMod & ALTMOD) && !(m_nKeyMod & CTRLMOD) )   // Alt without Ctrl
   PostMessage(m_hWnd, WM_SYSKEYDOWN, vk, lparam | 0x20000000);    // Key down, AltDown=1
else
   PostMessage(m_hWnd, WM_KEYDOWN, vk, lparam);    // Key down

Ta sygnatura jest pusta.

Opublikowano

HWND okno;
   okno = FindWindow("Notepad",0);
DWORD jed=GetCurrentThreadId();
DWORD nota=GetWindowThreadProcessId(okno, NULL);
AttachThreadInput(jed, nota, true);
    getch();
   Sleep(1000);
   SetActiveWindow(okno);
PostMessage(okno,WM_KEYDOWN,0x57,LPARAM(5));
Sleep(500);
PostMessage(okno,WM_KEYUP,0x57,NULL);

Co tu jest źle jeszcze?

Opublikowano

@mrozek a po co ci getch w kodzie jak i tak z niego nie korzystasz???.

 

 

i według mnie ten koo

WM_KEYUP

odpowiada za kliknięcie klawisza w górę a nie aby pościć klawisz myszki.]

Mogę sie mylić co to tego. Aha i pamiętaj iż Sleep z windows.h usypia cały program.

hcq0.png


Opublikowano

Zle sie do tego zabierasz. Notepad to jedynie "ramka" notatnika w niej sie nie pisze. Trzeba jeszcze znalezc childa czyli okno ktore sluzy do pisania wlasnie.

 

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

Pisalem dosyc dawno, nie chcialo mi sie komentowac, jak czegos nie wiesz to pisz.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...