Avatar billede mad_man Nybegynder
29. juni 2004 - 18:06 Der er 10 kommentarer og
1 løsning

sende tekst til program

hvis jeg starter et progam fra mit program.... er det så en måde at jeg kan få mit program til og sende tekst (keystrokes) til det program...

i mit tilfælde skal jeg bruge noget der kan sende keystrokes til en HLTV server...

/madman
Avatar billede arne_v Ekspert
29. juni 2004 - 18:16 #1
Jeg mener at de relevante kalder er FindWindow og PostMessage, men jeg har aldrig fået
det til at virke rigtigt.
Avatar billede mad_man Nybegynder
30. juni 2004 - 13:37 #3
jeg kan godt finde vinduet med FindWindow har en test med et tekst dokument men har et lille problem... jeg kender ikke den fulde tekst på vinduet :S den skifter nemlig... hvad kan jeg gøre

    HWND HLTVWnd = NULL;
    HLTVWnd = FindWindow(NULL,"Ny Tekstdokument.txt - Notesblok");

og så en anden lille ting...

PostMessage(HLTVWnd, WM_KEYDOWN, 'q', 'q');
PostMessage(HLTVWnd, WM_KEYUP, 'q', 'q');
hvordan får jeg den til og skrive bokstaver.... det der funker nemlig ikke så godt :S

    PostMessage(HLTVWnd, WM_KEYDOWN, VK_RETURN, VK_RETURN);
    PostMessage(HLTVWnd, WM_KEYUP, VK_RETURN, VK_RETURN);

og er det ikke enter ?
Avatar billede mad_man Nybegynder
30. juni 2004 - 13:37 #4
kan man ikke bruge wildcards i FindWindow ?
Avatar billede mad_man Nybegynder
30. juni 2004 - 15:24 #5
hmm nu har jeg sikker lavet noget mere besværligt end det er...

    HWND hWnd = FindWindow(NULL,GW_HWNDFIRST);
    while(hWnd != 0)
    {
        if(IsWindow(hWnd))
        {
                length = GetWindowTextLength(hWnd);
                GetWindowText(hWnd, text, length +1);
                if(strstr(text,"Winamp")) //test
                {
                    break;
                }
        }
        hWnd = GetWindow(hWnd, GW_HWNDNEXT);
    }
bruger det til og finde et vindue med
Avatar billede arne_v Ekspert
30. juni 2004 - 16:07 #6
Jeg har som sagt aldrig fået PostMessage til at virke som jeg vil have det
(ganske vist fra VB men ...).

Men du kan finde en del eksempler på den på nettet.
Avatar billede bertelbrander Novice
30. juni 2004 - 20:04 #7
Du kan med fordel bruge EnumWindows til at finde vinduet når du kun kender en del af titlen:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/enumwindows.asp

Hvad er en "HLTV server"?
Jeg vil måske prøve at lave et lille program senere.
Avatar billede bertelbrander Novice
01. juli 2004 - 00:34 #8
Følgende konsol app ser ud til at virke.
Du kalder det ved at angive (dele af) titlen på det vindue der skal modtage taste trykkene som første parameter (brug "" hvis der er mellemrum i titlen) og de tegn der skal sendes som anden parameter (evt i ""), der skal bruges STORE bogstaver, de modtages som små bogstaver.

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

HWND DestWin;
HWND Me;
BOOL CALLBACK EnumWinProc(HWND hwnd, LPARAM lParam)
{
  char Title[1024];
  if(hwnd != Me && GetWindowText(hwnd, Title, sizeof(Title)))
  {
      if(strstr(Title, (char *)lParam))
      {
        DestWin = hwnd;
        return FALSE;
      }
  }
  return TRUE;
}

int main(int argc, char *argv[])
{
  char MyTitle[1024];
  if(argc != 3)
  {
      fprintf(stderr, "Usage: %s windowtitle keystosend\n", argv[0]);
      return EXIT_FAILURE;
  }
  /* First get my window handle */
  GetConsoleTitle(MyTitle, sizeof(MyTitle));
  Me = FindWindow(0, MyTitle);

  EnumWindows(EnumWinProc, (LPARAM )argv[1]);
  if(DestWin)
  {
      int i;
      /* Set focus to dest window, to do that we have to Attatch to it's input queue */
      DWORD OtherThreadId = GetWindowThreadProcessId(DestWin, 0);
      DWORD MyThreadId = GetCurrentThreadId();
      AttachThreadInput(MyThreadId, OtherThreadId, TRUE);
      SetFocus(DestWin);
      for(i = 0; argv[2][i] != 0; i++)
      {
        keybd_event(argv[2][i], 0, 0, 0);
        keybd_event(0, 0, KEYEVENTF_KEYUP, 0);
      }
      /* Put me back in focus, detatch for the other window */
      SetWindowPos(Me, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
      SetFocus(Me);
      AttachThreadInput(MyThreadId, OtherThreadId, FALSE);
      return EXIT_SUCCESS;
  }
  return EXIT_FAILURE;
}
Avatar billede bertelbrander Novice
01. juli 2004 - 00:39 #9
Følgende sekvens sender et H der bliver modtaget som et H (og ikke h):

keybd_event(VK_SHIFT, 0, 0, 0);
keybd_event('H', 0, 0, 0);
keybd_event('H', 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
Avatar billede tommya Nybegynder
05. juli 2004 - 12:41 #10
kan du ikke bare bruge SendMessage i stedet for PostMessage, så bliver beskeden ikke sat i kø
Avatar billede mad_man Nybegynder
18. juli 2004 - 16:16 #11
projektet droppet... programmet jeg vilde kalde var dårligt lavet så det gik hele tiden kold
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester