• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ GetThreadId nie działa?

Object Storage Arubacloud
0 głosów
215 wizyt
pytanie zadane 16 kwietnia 2017 w C i C++ przez Kurogami12 Bywalec (2,610 p.)
no więc.. jak mówiłem, funkcja getthreadid nie działa, po prostu system jej nie znajduje, znajduje się na Windows 7 więc z tego co wyczytałem w necie nie powinno być problemów, działa za to GetCurrentThreadId(), czy to jest to samo, czy może są znaczące różnice? jeśli są to.. co zrobić, żeby działało tak jak chce żeby działało, oczywiście chodzi o haki, nie działa podanie ostatniego argumentu jako 0, niestety nigdzie nie znalazłem odpowiedzi, wie ktoś coś może na ten temat?
1
komentarz 16 kwietnia 2017 przez niezalogowany

Powoli, twoje pytanie jest strasznie chaotycznie napisane, przede wszystkim:

  • co to znaczy "system nie znajduje GetThreadId"? Masz jakiś błąd przy kompilacji, jeżeli tak to jaki?
  • podaj swój kod
  • "co zrobić, żeby działało tak jak chce żeby działało" czyli jak powinno działać?
komentarz 17 kwietnia 2017 przez Kurogami12 Bywalec (2,610 p.)
  • GetThreadId undeclared(first use this function) - myślałem, że to oczywiste
  • nie rozumiem w jakim celu jest tutaj kod, dodam jednak, że mam zaimplementowaną biblioteke windows.h a błąd znajduje się tutaj g_MyHook = SetWindowsHookEx( WH_KEYBOARD, & AltF4Proc, NULL, GetThreadId( GetCurrentThread() ) ); konkretnie w getthreadid (jak napisałem wyżej) i to jedyny błąd)
  • no tak, faktycznie nie wyjaśniłem co miałem na myśli, uczę się korzystać z haków, a funkcja SetWindowsHookEx potrzebuje GetThreadId(GetCurrentThread), przynajmniej według tego kursu: http://cpp0x.pl/kursy/Kurs-WinAPI-C++/Zaawansowane/Haki/199 oczywiście nie jest to szczególnie dla mnie jasne, ale słyszaszałem, że występują pewne problemy przy korzystaniu z GetCurrentThreadId
komentarz 17 kwietnia 2017 przez niezalogowany
Kod po to bo nikomu się nie chce zastanawiać co mogłeś zrobić źle, skoro nawet źle używasz podstawowych definicji, "zaincludowaną bibliotekę" jak już, a nie "zaimplementowaną"
komentarz 17 kwietnia 2017 przez Kurogami12 Bywalec (2,610 p.)

Definicja (z łac. definitio; od czas. definirede + finire, "do końca, granicy"; od finis: granica, koniec) – wypowiedź o określonej budowie, w której informuje się o znaczeniu pewnego wyrażenia przez wskazanie innego wyrażenia należącego do danego języka i posiadającego to samo znaczenie.

żródło: wikipedia

twoim zdaniem słowo "zaimplementować" to definicja? jak już to źle używam podstawowych pojęć, ale to dokładnie tak samo jak Ty. Może po prostu się bronisz, nie wiedząc jaka jest odpowiedź mimo swojego prawdopodobnie sporego doświadczenia na pytanie amatora, nie jesteś w stanie myśleć wystarczająco "abstrakcyjnie" żeby domyśleć się jaki błąd mógł popełnić amator i podać możliwe odpowiedzi, zamiast tego czepiasz się nieistotnych szczegółów które jedynie mogą doprowadzić do dyskomfortu? Jednak jeśli taki istotny dla Ciebie jest kod to oczywiście, mogę go podać, liczę, że udzielisz mi pomocy, która będzie Satysfakcjonująca dla mnie. Oczywiście jeśli nie to właściwie nie wiem do czego dążysz.. próbujesz mi ubliżyć? gdyż takie odnoszę wrażenie. Tak więc o to kod: 

#include <windows.h>

using namespace std;

HHOOK g_MyHook = NULL;     //Deklaracja haku
HWND hwnd; /* Ta funkcja dosłownie tworzy element, w tym wypadku okno ale może też stworzyć jakieś buttony i inne bajery */

LRESULT CALLBACK AltF4Proc( int code, WPARAM wParam, LPARAM lParam );
LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

MSG g_WU;   /* to jest żeby nasze okno mogło pobierać informacje od programu o tym co się akurat dzieje */



int WINAPI WinMain(HINSTANCE hInstance, /*jest to ważne ale nie umiem wytłumaczyć po co to jest dokładnie*/
                   HINSTANCE hPrevInstance, /*Właściwie to co do tego to kompletnie nie wiem co to */
                   LPSTR lpszArgument, /* co to to też nie mam pojęcia */
                   int nFunsterStill) /* jw */
{
      WNDCLASSEX Ws;   /*dosłownie klasa okna, jest bardzo ważna, właściwie to dzięki niej może istnieć okno */
    
      
    //To jest wypełnianie klasy okna, jeśli tego nie zrobimy aplikacja po prostu się nie skompiluje
    
    Ws.cbSize = sizeof(WNDCLASSEX);         //rozmiar struktury w bajtach
    Ws.style = 0;                              //Styl klasy
    Ws.lpfnWndProc = WinProc;                     //Wskaźnik do procedury obsługującej okno
    Ws.cbClsExtra = 0;                            //Dodatkowe bajty w pamięci dla klasy
    Ws.cbWndExtra = 0;                            //Dodatkowe bajty w pamięci dla klasy
    Ws.hInstance = hInstance;                     //Identyfikator aplikacji, która ma być właścicielem okna
    Ws.hIcon = LoadIcon(NULL, IDI_APPLICATION);   //Duża ikona okna, którą widać po wciśnięciu alt+tab
    Ws.hCursor = LoadCursor(NULL, IDC_ARROW);     //Kursor myszki
    Ws.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);  //Tło okna - kolor i wzór
    Ws.lpszMenuName = NULL;                       //Nazwa identyfikująca menu okna (którego w tym wypadku nie ma)
    Ws.lpszClassName = "Wzor";           //Nazwa okna
    Ws.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //Mała ikona okna;
    
    //-----------------------------------------------------------------------------------------------------------------
    
    //Sprawdzanie czy okno może zostać stworzone, ale raczej zawsze się udaje
    if( !RegisterClassEx( & Ws))
    {
        MessageBox(NULL, "Nie udało się otworzyć okna!", NULL, MB_ICONEXCLAMATION + MB_OK);
    }
    
    //Tutaj nadajemy parametry jakie ma posiadać nasze okno
    hwnd = CreateWindowEx(     /*CreateWindowEx służy nie tylko do stworzenia okna głównego ale do każdego elementu*/
    WS_EX_WINDOWEDGE,          /*Tutaj są takie rzeczy jak na przykład ramka itp, konkretnie: dwExStyle*/
    "Wzor",           /*Tutaj musi być to co podaliśmy w WNDCLASSEX no bo przecież to okno chcemy "stworzyć" - to jest nazwa klasy okna tj: lpClassName */
    "Wzór",           /*Tutaj jest to co będzie napisane na tej górnej belce tj: lpWindowName */
    WS_OVERLAPPEDWINDOW,      /*trudno wytłumaczyć co tutaj jest.. dwStyle */
    CW_USEDEFAULT, CW_USEDEFAULT, /* Tutaj jest lewy górny róg okna względem monitora a właściwie to nadrzędnego okna.. */
    500, 300,      /*nWidth, nHeight - są to wymiary okna szerokość i wysokość*/
    NULL,          /*Uchwyt okna rodzicielskiego, no w tym wypadku nie ma nWndParent*/
    NULL,          /*Uchwyt menu dla okna, domyślnie wciąż nie ma */
    hInstance,     /*To jest uchwyt aplikacji której przypisujemy okno, czyli tej aplikacji */
    NULL);         /*Wskaźnik do dodatkowych parametrów, ch** wie co to */
    
    
    //To się stanie jeśli z jakiegoś powodu nasze okno się nie uzupełni, czyli nie wykona się powyższy kod
    if(hwnd == NULL)
    {
            MessageBox( NULL, "Nie udało się otworzyć okna!", NULL, MB_ICONEXCLAMATION );
            return 1;
            }
    
    //To sprawia że nasze okno w końcu jest widzialne
    ShowWindow(hwnd, nFunsterStill);       
    UpdateWindow(hwnd);        //a to.. update robi na naszym oknie? nie mam pojęcia co to robi
    g_MyHook = SetWindowsHookEx( WH_KEYBOARD, & AltF4Proc, NULL, GetThreadId( GetCurrentThread() ));
    
    
    
    //Pobieranie informacji od komputera np o ruchu myszki, naciśnięciu klawisza itp
    //Ta pętla jest bardzo ważna - bez niej program włączyłby się i od razu by się wyłączył
    while(GetMessage(&g_WU, NULL, 0, 0))
    {
          TranslateMessage(&g_WU);
          DispatchMessage(&g_WU);
    }
    return g_WU.wParam;
    
}

LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) /* Bebechy naszej kochanej funkcji*/
{
        switch(message)       /* tutaj w zależności od tego co zrobimy wykona się coś */
        {
                   case WM_CLOSE:      /* Tutaj oczywiście w wypadku próby zamknięcia wykona się.. próba zamknięcia */
                        DestroyWindow(hwnd);
                        break;
                   case WM_DESTROY:         /*A tutaj po prostu program się zamknie. */
                        UnhookWindowsHookEx( g_MyHook );
                        PostQuitMessage(0);
                        break;
                        
                   default:   /* W wypadku jeśli coś się stanie ale to nie pasuje do niczego to po prostu nic się nie stanie :v */
                        return DefWindowProc(hwnd, message, wParam, lParam);
        }
        
        return 0;       /* Jeśli funkcja zadziałałą poprawnie to na 100% zwróci 0 */
        }



LRESULT CALLBACK AltF4Proc( int code, WPARAM wParam, LPARAM lParam )
{
        if(code<0) return CallNextHookEx( 0, code, wParam, lParam );
        if(wParam == VK_F1 && (lParam & 536870912 ) )
        {
                  MessageBox(hwnd, "Wcisnąłeś Alt+F1!", NULL, MB_ICONEXCLAMATION);
                  return 1;
                  }
        return CallNextHookEx( 0, code, wParam, lParam );
        }

o to fragment kodu w którym jest błąd:

    g_MyHook = SetWindowsHookEx( WH_KEYBOARD, & AltF4Proc, NULL, GetThreadId( GetCurrentThread() ));

Czy teraz jesteś w stanie udzielić mi pomocy? bardzo by to było miło jakby ktoś tak doświadczony jak Ty mi pomógł (kod jest stosunkowo długi i ma moje własne komentarze które używałem na samym początku nauki WinApi i zostawiłem se jako wygodny dla siebie wzór, dlatego nie bardzo chciałem wrzucać cały kod)

1
komentarz 20 kwietnia 2017 przez niezalogowany
Wciąż upieram się przy swoim doborze słów, w każdym razie to tobie powinno zależeć na dostarczeniu jak największej ilości informacji dla osób które mogą chcieć ci pomóc.

Jeżeli tego nie robisz to sorry, ale większość osób uzna że szkoda ich czasu, na gościa z którym trzeba się pałować w celu uzyskania konkretów ;) To tyle

1 odpowiedź

0 głosów
odpowiedź 16 kwietnia 2017 przez tangarr Mędrzec (154,860 p.)
wybrane 21 kwietnia 2017 przez Kurogami12
 
Najlepsza
DWORD WINAPI GetThreadId(_In_ HANDLE Thread);
DWORD WINAPI GetCurrentThreadId(void);


Aby użyć funkcji GetThreadId musisz przekazać do niej uchwyt wątku.
GetCurrentThreadId() jest równoznaczne z GetThreadId(GetCurrentThread())

Podobne pytania

0 głosów
0 odpowiedzi 174 wizyt
pytanie zadane 18 kwietnia 2017 w C i C++ przez Kurogami12 Bywalec (2,610 p.)
0 głosów
2 odpowiedzi 363 wizyt
pytanie zadane 12 grudnia 2017 w C i C++ przez pionk18 Obywatel (1,590 p.)
0 głosów
1 odpowiedź 3,606 wizyt
pytanie zadane 24 listopada 2017 w C i C++ przez applepie Początkujący (250 p.)

92,621 zapytań

141,477 odpowiedzi

319,817 komentarzy

62,005 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...