Ich hab' da mal mehrere Fragen



  • Ich hab' mal mehrere Fragen, die ich gerne beantwortet hätte. Schick mich bitte in kein anderes Unterforum, weil ich folgendes mit WinAPI erledigt haben will:
    1. Bei mmsytem.h sind mehrere Befehle, die sich auf Joypads beziehen, aber ich krieg die nicht zum laufen. Bitte erklärt mir wie ich eine Aktion ausführen kann sobald eine Taste gedrückt wurde.
    2. Wie kann ich andere Programme schließen, die im Vollbildmodus laufen (halt sowas wie spiele oder so) oder während mein Fenster gar nicht aktiv ist? Um genau zu sein, es soll mit der Rechtenmaustaste gehen (falls euch das weiterhelfen sollte) und am besten wäre es auch noch, wenn mir jemand sagt, wie ih ein mein Programm im Hintergrund laufen lassen kann.
    3. Wie kann ich ein eigenes Design in Windows reinbringen oder besser gesagt: Wie kann ich MEINEN Fenstern ein neues Design verleihen?
    4. Brauch ich bestimmte libarys um sowas wie DVD-Programme, MP3-Programme, etc. zu erstellen und gibt es irgendwo vielleicht Quelltexte von solchen Programmen?
    5. Gibt es einen Trick Parameter von Programmen herauszufinden (also unter Windows, nicht mit C++), die nirgends erwähnt sind (also nicht in irgendeiner *.txt und -h oder -? geht auch nicht)?
    6. Was ist die MDSN und wo krieg ich sie?(ich bin halt 'n Noob, aber ich hoffe ihr hilft mir dabei das zu änderen)
    7. Wie kann ich den Sinn der Parameter von Funktion herausfinden, die ich nicht kenne?



  • Hallo, kann nicht alle Fragen beantworten, aber zu folgenden Punkten:

    3. Ein eigenes Design lässt sich schon mit WinAPI reinbringen. Zum einen kannst du Menüs, Buttons, Listboxes und Comboboxes (vielleicht noch andere Controls) selber zeichnen kannst.
    Das ist aber schon etwas komplexer, da musst du als Stil beim Erzeugen eines solchen Fensters BS_OWNERDRAW angeben und darfst sonst keine anderen Stile verwenden. Ich würde dich ja in der Hinsicht auf die MSDN verweisen, aber die scheinst du ja nicht zu haben, denn

    6. Die MSDN (Microsoft Developer Network) ist eine große Hilfesammlung von Microsoft zu allen seinen Produkten, z.B. VC++ aber auch für WinAPI Programmierung ein Muss. Sie liegt entweder VC++ bzw. ähnlichen Microsoft Produkten bei oder lässt sich sicherlich auch bei www.msdn.de runterladen (ist natürlich ganz schön groß).
    Außerdem kannst du für Fenster das Flag WS_EX_TRANSPARENT setzen, was das Fenster zum Teil transparent macht. Zusätzlich kannst du in Fenster selber zeichnen, und zwar mit entsprechenden GDI-Funktionen.
    Suche einfach im Forum nach den Begriffen Ownerdraw usw.

    7. Den Sinn von Funktionen herauszufinden, die du nicht kennst, ist natürlich schwierig.
    Dazu müsstest du eben eine Online Hilfe zur Verfügung haben, die dir die Parameter und die Funktionsweise einer Funktion erklärt.
    Und dass ist für alle WinAPI Funktionen eben wieder die MSDN.



  • Zu 2.: Dein Programm läuft immer weiter, auch im Hintergrund.

    Zu 4.: Natürlich kann man das alles ohne libs schreiben. Nur manchmal ist das eben viel zu viel Arbeit. Was meinst du denn genau mit "DVD-Programmen" und "MP3-Programmen"? Meinst du DVD/MP3-Player oder meinst du DVD-Entschlüsselungstools und MP3-Encodierer?

    Zu 5.: Naja, du könntest die exe-Datei disassemblieren und die String-Resourcen durchgehen. Ist aber eine heidenarbeit, die sich nur sehr selten lohnt. Wenn etwas nicht dokumentiert ist, wird der Programmierer dafür schon seine Gründe haben.

    Zu 6.: Die komplette MSDN Library lässt sich nicht runterladen (zumindest nicht offiziell). Die gibts aber auf DVD/CD als Abo oder bei ebay.
    Das Platform SDK kann man aber herunterladen.



  • 1.z.B.

    joySetCapture(dein_fenster,JOYSTICKID1, 100/* ms*/,0);
    //in der fensterprozedur:
    MM_JOY1BUTTONDOWN : aktion_press();break;
    MM_JOY1BUTTONUP : aktion_release();break;
    

    2. fenster schliessen :

    fenster_handle=GetActiveWindow();
    SendMessage(fenster_handle,WM_CLOSE,0,0);
    /// für hartnäckige fälle:
    SendMessage(fenster_handle,WM_DESTROY,0,0);
    

    rechte maustaste abfangen geht wohl nur über eine mousehook(macht arbeit)

    4. für mp3 gibt es viel (blade ist AFAIK GPL allerdings gabs irgendwelche lizensprobs bei der weitergabe der compilierten version:schlau machen)
    - mp3pro/AAC/DVD höchstens illegales
    - mp4: mal nach "ffdshow" gucken



  • Soweit erstmal danke, aber nochmal:
    1. Weiß ich immer noch nicht.
    2. Dass meine Programme im Hintergrund weiterlaufen ist mir klar, aber wie kann ich es machen, dass z.B. egal welches Programm läuft eine bestimmte Aktion (halt Programme schließen (das Programme schließe, hab ich jetzt schon raus)) durchgeführt wird sobald ich die Rechtemaustaste drücke, auch wenn mein Programm nur im Hintergrund läuft? Also dass mein Programm auf Eingaben reagiert, die nicht bzw. nur indirekt für mein Programm bestimmt sind?
    3. Soweit erst mal danke!
    4. Ich meinte Player und mit den Libs meinte ich, ob ich spezielle libs irgendwo ziehen muss/kann.
    5. OK, dan sprech' ich mal dieses Thema direkt an: Wie kann ich Emus so starten (also mit Parametern), dass sie direkt ein Spiel bzw. Rom starten (welches ich mit den Parametern angebe) und in wie fern sind Emus legal? Einfach Emu.exe -pfaddesroms geht glaub' ich nicht und wenn ihr was über die Legalität gehört habt, aber nicht genau bescheid wisst, dann sagt bitte nichts dazu. Ich hab' mich selber mal umgehört und tausende von verschiedenen Meinungen dazu gehört.
    6. Danke, hab' mir sowas schon gedacht. (Das "Noob" bezog sich übrigends auf sowas wie WinAPI, DirectX,etc. , halt auf weiterführende C++ Themen und nicht auf sowas wie den PC an sich)
    7. Ich meinte wie ich den Sinn der Parametern herausfinde. Und die Funktionen kenn' ich schon, aber nicht sogut um den Sinn der Parameter zu wissen. Aber das steht auch bestimmt in der MSDN.



  • Zu 2.:
    Normalerweise kann man dafür eine Hook nehmen (-> Suchfunktion).
    Wenn das Programm das im Vollbild läuft die Tastatur/Maus aber über DirectInput abfragt (was bei Spielen sehr wahrscheinlich ist) nutzt dir eine Hook nichts.

    Nur ein Vorschlag: Das Programm "Morrowind FPS Optimizer" ist Open Source. Wenn das im Hintergrund läuft, reagiert es auf Tastendrücke im Spiel. Vielleicht findest du in dem Code was in der Richtung.

    Zu 5.:
    Das hängt natürlich von dem konkreten Emulator ab, den du benutzt. Du könntest genauso gut fragen: "Wie aktiviere ich bei nem Spiel die Konsole?".
    Normalerweise ist bei jedem Emulator eine Anleitung dabei. Wenn da nicht drinsteht wie das geht, geht es nicht.
    Emulatoren an sich sind nicht illegal, AFAIK. Die Roms sind allerdings illegal, und zwar sofort wenn man sie runterlädt (also nicht erst nach 24h wie man häufig hört).



  • Hi, also erstmal zu deinem MausProblem.
    Ich würde einen globalen Hook verwenden, wobei man aber die Funktion, in der die mouse-actions behandelt werden, in eine DLL schreiben muss.
    Gesetzt wird der Hook dann so:

    HINSTANCE Library = LoadLibrary("dll.dll");
    FARPROC func = GetProcAddress((HMODULE)Library, "mousehook");
    HHOK hook = SetWindowsHookEx(WH_MOUSE, func, Library,0);
    /*...*/
    UnhookWindowsHookEx(hook);
    FreeLibrary(Library);
    

    das ist es im großen und ganzen auch schon. Du darfst in der Funktion, die die hooks verwaltet (in dem Fall mousehook()) nur nicht vergessen CallNextHookEx();
    zu verwenden.
    War jetzt nur schnell hingeschrieben, Fehler sind nicht auszuschließen 😉

    Wegen deinem msdn, könnte der http://msdn.microsoft.com/library vielleicht weiterhelfen. Is nicht das nobelste aber zur Not reichts auch.
    Die Win-SDK selbst gibts auf ftp://ftp.cs.virginia.edu/pub/lcc-win32/win32hlp.exe
    zum runterladen.

    mfg
    jghj



  • achja, was ich noch vergessen habe. Der Prototyp der Funktion mousehook() sollte so aussehen:

    extern "C" __declspec(dllexport) void MouseProc(int nCode, WPARAM wParam, LPARAM lParam);
    

    (entnommen von http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Hooks/HookReference/HookFunctions/MouseProc.asp)

    wenn jedoch die mausaktionen wie cd9000 gemeint hat, direkt laufen, wird das etwas schwieriger.
    Dann musst du hoffen dass der mousehandle des programms in einer dll ist, (am besten mit dem dependency walker die dlls durchforsten), und was dazuschreiben.
    (mit WriteProcessMemory())
    näheres dazu auf: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcesdk40/html/_wcesdk_win32_WriteProcessMemory.asp
    aber ob dir das der aufwand wert ist...

    mfg jghj



  • Oh sorry, ich hatte den Post von Lui übersehen.
    zu 1: Jetzt weiß ich wie es geht, bloß mein Compiler macht Probleme:

    [Linker error] undefined reference to `joySetCapture@16'
    Ich hab' mir den Dev-cpp gezogen, aber weiß nicht genau was für ein Compiler drin ist (müsste aber der Gnu Compiler (gcc.exe) sein). Könnt ihr mir weiterhelfen?

    zu 2: hatte ich schon irgendwie hingekriegt, totzdem DANKE!!!
    Aber wegen dem Mousehook: Sorry, aber ich bin noch echt ein Noob und soweit ich das überblicken kann, gibt es auch keine gute/umfangreiche Einführung in die WinAPI. Könntet ihr mir !!!!!!BITTE!!!!!! den kompletten Sourcecode für einen Moushook geben? Und mit Kommentar, wo ich denn was verändern muss. Ich wär euch echt dankbar!!!

    zu 4: ich weiß nicht, aber du hast mir glaub' ich links zu Codecs gegeben, ich wollte Player. Wär nett wenn ihr was finden würdet was legal ist und wo man auch legal denn Quelltext verändern kann.

    zu 5: Das stimmt schon mit den Parametern, aber ich bin mir sicher, dass es die beim Emulator gibt und ich dachte es gibt 'ne "fast-Patentlösung". Bei den Spielen ist es vielleicht nicht immer so, aber wie ich das überblicke ist es häufig "^". Aber wenn man seine Roms als Orginalspiele hat, sind sie doch legal, oder?

    zu 6: Noch mal DANKE!!! Ich werd's mir gleich angucken.



  • das in deinem Programm zum starten des hooks:

    #include <windows.h>
    
    using namespace std;
    HINSTANCE Library;
    HHOOK hook;
    
    void starthook(const char *dllname, const char *funcname) {
        FARPROC func;
        Library      = LoadLibrary(dllname); 
        FARPROC func = GetProcAddress((HMODULE)Library, funcname); 
        hook         = SetWindowsHookEx(WH_MOUSE, func, Library,0); 
    }
    
    void stophook(HINSTANCE libhandle, HHOOK hhandle) {    
        UnhookWindowsHookEx(hhandle); 
        FreeLibrary(libhandle);  
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevhI, PSTR cline, int ishow) {
        /*Deine bisherigen codes*/
        starthook("hookproc.dll", "mousehook"); //Zum starten des hooks
    
        /*weitere codes die von dir kommen*/
    
        stophook(Library, hook); //Ganz am Ende des Programms den Hook auch wieder abmelden
        return 0;
    }
    

    Jetzt der code aus der "hookproc.cpp" (was dann die "hookproc.dll" macht):

    #include <windows.h>
    
    using namespace std;
    
    extern "C" __declspec(dllexport) void MouseProc(int code, WPARAM wparam, LPARAM lparam) {
        if(code < 0) {
            goto end;
        }
    
        if(code == HC_ACTION) {
            /*Hier sollte jetzt die überprüfung rein, ob ein Rechter Mausklick gemacht wurde, Hab aber keine Ahnung wie das geht, da ich selbst noch nie nen mousehook gebraucht habe :\
            Vielleicht weiß ja jemand anderes aus dem board noch was dazu?*/
        }
    
        end:;
        CallNextHookEx(code, wparam, lparam);
    }
    

    So in etwa dürfts stimmen, is ungetestet, vielleicht irgendwo ne klammer oder ';' vergessen, aber wenn ja, dann solltest des hinbekommen 😉
    wparam (in der dll funktion) is ein pointer auf die MOUSEHOOKSTRUCT struct, vielleicht is da irgendwas drüber beschrieben:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Hooks/HookReference/HookStructures/MOUSEHOOKSTRUCT.asp

    solltest ja immernoch selbst bissl was daran arbeiten 😉

    mfg jghj





  • 1.hatte ich vergessen :unter
    projektoptionen->
    linkerparameter->
    "-lwinmm"
    eintragen, das bindet die bibliothek zu mmsystem "libwinmm.a" ein
    4. die einzigsten griffbereiten links zu mp3 codecs unter (L)GPL:
    http://www.mpg123.de
    http://www.mp3dev.org
    (wenn es die noch gibt)



  • 1. DANKE!!! Auch wenn ich ein Noob bin, der voll nichts drauf hat, bin ich für eure Hilfe wirklich dankbar und weiß es zu schätzen, dass ihr Leuten wie mir weiterhelft (anderst als viele andere)
    2. Dein Code gibt mir einige Rätsel. Ich hab' ihn noch nicht getestet, da er mir in dem Zustand NOCH nichts nutzt (trotzdem danke). Aber folgende Fragen:
    - Wieso deklarierst du in starthook zweimal func? Einmal deklarierst du es und einmal initalisierst du func direkt nach der anderen Deklaration.
    - stophoock muss doch erst bei WM_DESTROY gemacht werden und nicht bei WinMain, oder?
    - Ist der hook jetzt immer aktiv und muss ich dann nur normal WM_RBUTTONDOWN abrufen?
    - Kann mir hier Irgendjemand anderes sagen was bei der DLL reinkommt?
    4. Ich wollte keine codecs, sondern player.
    Nochmal Danke für eure Hilfe!!!



  • Icy Wolf schrieb:

    Wieso deklarierst du in starthook zweimal func? Einmal deklarierst du es und einmal initalisierst du func direkt nach der anderen Deklaration.

    Die erste Deklaration ist eigentlich überflüssig bzw. die 2. dadurch fehlerhaft 🙄

    Icy Wolf schrieb:

    stophoock muss doch erst bei WM_DESTROY gemacht werden und nicht bei WinMain, oder?

    Warum nicht so? Dort kommt das Programm doch erst hin, nachdem die Message-Loop geendet ist (also erst nach WM_DESTROY) 😉

    Icy Wolf schrieb:

    Ist der hook jetzt immer aktiv und muss ich dann nur normal WM_RBUTTONDOWN abrufen?

    Also die Mausnachrichten musst du in der DLL, also genauer gesagt in MouseProc verarbeiten 🙂

    Icy Wolf schrieb:

    Kann mir hier Irgendjemand anderes sagen was bei der DLL reinkommt?

    Die MSDN-Library kann das: MouseProc
    Also müsstest du - so wie ich das verstanden habe - im wParam ganz normal z.B. WM_RBUTTONDOWN bekommen. Weitere Infos bekommst du dann über die MOUSEHOOKSTRUCT im lParam


Log in to reply