Avatar billede xeon Nybegynder
15. juni 2003 - 22:33 Der er 18 kommentarer og
1 løsning

Gemme internetadresse i char-array

Dau eksperter

  Jeg har lidt problemer med at få GetWindowText() til at virke. Problemet er at jeg vil have den internetadresse brugeren skriver gemt i et char-array. Jeg kunne forestille mig at det skulle se nogenlunde sådan ud:

char test[222]=GetWindowText(/*her ved jeg ikke hvad der skal stå*/);

er det rigtigt og hvis ja hvad skal der så stå i parentesen??
Avatar billede arne_v Ekspert
15. juni 2003 - 22:36 #1
Avatar billede xeon Nybegynder
15. juni 2003 - 22:50 #2
bruger dev-cpp og får en fejl af følgende test

#include <windows.h>

int main()
{
char test[222];

GetWindowsText(whandle, test, sizeof(test));

return 0;
}

der står at det er whandle der er skyld i den. Jeg har været inde på linket og undre mig lidt over hvor du får whandle fra??
Avatar billede driis Nybegynder
15. juni 2003 - 22:51 #3
whandle skal være et HANDLE til det vindue, du ønsker at hente teksten fra.
Avatar billede xeon Nybegynder
15. juni 2003 - 22:53 #4
ja men hvor får jeg den handle fra??
Avatar billede driis Nybegynder
15. juni 2003 - 22:56 #5
Eksempelvis fra FindWindow funktionen, den kan du finde info om på MSDN Library. Det kommer an på, hvilket vindue du vil have fat i.
Jeg kan forklare nærmere i morgen, har ikke tid nu - men det er der sikkert en anden, der har ;-)
Avatar billede xeon Nybegynder
15. juni 2003 - 23:03 #7
Det kan godt være at jeg misforstår men på arnes link står der der ikke til hvis jeg selv laver vinduet??

  Hva nu hvis det er et vindue der er lavet af en anden programmør, i mit tilfælde internet explorer
Avatar billede xeon Nybegynder
15. juni 2003 - 23:30 #9
Kiggede i et af de andre spørgsmål og fandt en kode der næsten er som jeg skal bruge den (har ændret lidt i den):

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

using namespace std;

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
  char text[1024], newtext[1024];
  GetWindowText(hwnd, text, sizeof(text));
    if(strstr(text, "Microsoft Internet Explorer"))
  {
  cout<<text<<endl;
  }

  return TRUE;
}

int main(void)
{
  EnumWindows(EnumWindowsProc, 0);
  system("pause");
  return 0;
}

Det eneste er bare at den i stedet for adressen viser det øverste (på nuværende tidspunkt: Eksperten | Programmering : C/C++ :Gemme internetadresse i char-array - Microsoft Internet Explorer) i stedet for det som jeg vil have nemlig: http://www.eksperten.dk/spm/365239 altså internetadressen.
Avatar billede bertelbrander Novice
16. juni 2003 - 00:54 #10
Du skal løbe child vinduerne for IE-vinduet igennem og finde det vindue der har text'en.
Du løber child vinduerne igennem med EnumChildWindows (virker ligesom EnumWindows). Du kan så hente teksten med GetWindowText() for alle child-vinduer (det kan være nødvendigt at sende WM_GETTEXT direkte).
Du kan bruge GetDlgCtrlID() til at få ID'en for vinduet, så kan du prøve dig frem indtil du finder det rigtige.
Avatar billede tam Nybegynder
16. juni 2003 - 02:07 #11
Arne_v >
Du skriver

char test[222];
GetWindowsText(whandle, test, sizeof(test));

sizeof(test) vil give 4 fordi test er en pointer ;)

det skulle være GetWindowsText(whandle, test, 222);
Avatar billede arne_v Ekspert
16. juni 2003 - 06:26 #12
tam>

char test[222];

sizeof(test)

returnerer 222 !

(prøv selv)
Avatar billede tam Nybegynder
16. juni 2003 - 12:09 #13
Arne_v >

Interessant, du har fuldstændig ret, sorry...

Men jeg synes stadigvæk den er potentielt farlig da

char *test = (char*)malloc(222);
sizeof(test);

giver 4 ;)
Avatar billede xeon Nybegynder
16. juni 2003 - 12:35 #14
Jeg må ærlig talt indrømme at jeg ikke kender noget til EnumChildWindows(). Er der en der gider forklare mig om den. Er det en funktion jeg bare skal køre igennem med et loop  EnumChildWindows(1) osv........?
Avatar billede xeon Nybegynder
16. juni 2003 - 12:52 #15
glem jeg spurgte. Er kommet så langt her men sidder fast nu

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
//BOOL WINAPI EnumChildWindows(HWND,ENUMWINDOWSPROC,LPARAM)
using namespace std;

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
  char text[1024], newtext[1024];
  GetWindowText(hwnd, text, sizeof(text));
    if(strstr(text, "Microsoft Internet Explorer"))
  {
  EnumChildWindows(hwnd, EnumWindowsProc, 1);
  GetWindowText(hwnd, text, sizeof(text));
  cout<<text<<endl;
  }

  return TRUE;
}

int main(void)
{
  EnumWindows(EnumWindowsProc, 0);
  system("pause");
  return 0;
}
Avatar billede driis Nybegynder
16. juni 2003 - 14:30 #16
Du skal enumerere dine child windows. For hvert child window skal du så kontrollere, om det er addressefeltet, du har fat i. Addressefeltet er altid en ComboBoxEx32, og derfor kan du kontrollere om det er det rigtige child window ved at hente det pågældende vindue's class name. Dette fejler dog i det tilfælde at der er mere end én ComboBoxEx32 i et Explorer vindue - jeg kan dog ikke komme på, hvornår dette skulle være tilfældet ;-). Når du har fundet det rigtige child window, sender du en WM_GETTEXT message til vinduet og får derved kopieret indholdet af addressefeltet over i en buffer.

Eksempel:
Avatar billede driis Nybegynder
16. juni 2003 - 14:30 #17
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <commctrl.h>

using namespace std ;

BOOL CALLBACK EnumChildProc(
  HWND hwnd,      // handle to child window
  LPARAM lParam  // application-defined value
)
{
    char text[1024] ;
    LPARAM l ;
    COMBOBOXINFO cbInfo ;
    cbInfo.cbSize = sizeof(cbInfo) ;

    if ( GetClassName(hwnd,text,sizeof(text)) )            // Modtag child vinduets classname
    {
        if ( strcmp(text,"ComboBoxEx32") == 0 )            // Addresse feltet er en ComboBoxEx32
        {
            // Send en Get text message til addresse - feltet.
            if ( SendMessage(hwnd,WM_GETTEXT,1024,(LPARAM)text) )
                cout << text << endl ;                    // Teksten i addressefeltet skulle gerne
            else                                        // ligge i text.
                cout << "Error !" << endl  ;
        }
    }
    return TRUE ;
}

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    static int exCount = 0 ;
    char text[1024] ;
    GetWindowText(hwnd, text, sizeof(text));
    if(strstr(text, "Microsoft Internet Explorer"))
    {
        cout << "Explorer vindue no # " << ++exCount << endl
            << text << endl ;
        EnumChildWindows(hwnd,EnumChildProc,0) ;
        cout << endl ;
    }

    return TRUE;
}

int main()
{
    EnumWindows(EnumWindowsProc,0) ;

    getch() ;
    return 0 ;
}
Avatar billede arne_v Ekspert
16. juni 2003 - 14:40 #18
tam>

Det er en meget brugt anvendelse af sizeof.

char b[1000];
memset(b,'\0',sizeof(b));

int a[100];
for(int i=0;i<(sizeof(a)/sizeof(int));i++) s[i]=i;

etc.etc.
Avatar billede xeon Nybegynder
16. juni 2003 - 16:06 #19
tak for hjælpen det var lige det jeg manglede :)
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