Hotkeylösung nicht ganz richtig!



  • Hallöchen, ich bin seit langem dabei mir ein Programm zu schreiben, welches mir bei bestimmten Tastenkombinationen, Aktionen erlaubt die dann SYSTEMWEIT zum einsatz kommen nach ihrer Verarbeitung. Somit bin ich auf die Funtkion GetAsyncKeyState() gestoßen und es ging auch soweit dass es tat was es sollte:
    Strg + n = Ordner erstellen
    Strg + Alt + i = IE öffnen
    Hier der Code meiner 1. Lösung:

    #include <iostream>
    #include <iomanip>
    #include <vector>
    #include <windows.h>
    #include <direct.h>
    #include <process.h>
    using namespace std;
    
    class HKEYS
    {
       private:
          SHORT status;
          char *path, concatIt[20], container[20];
          int counter;
          vector<int> myArray;
       public:
          HKEYS();
          void makeFiles(int);
          void startApps(int);
          void editKeys();
    };
    
    HKEYS::HKEYS()
    {
       //strg + n = neuer Ordner, strg + alt + i = IE öffnen
       //strg + alt + h = html datei erstellen, strg + alt + t = txt datei erstellen
       //strg + alt + b = bat datei erstellen, strg + alt + c = cmd öffnen
       //strg + alt + w = doc datei erstellen, strg + alt + x = xls datei erstellen
       status = 0, counter = 0;
       path = "Ordner";
       myArray.push_back(VK_CONTROL); //strg index: 0 (Wert: 17)
       myArray.push_back(VK_MENU); //alt index: 1 (Wert: 18)
       myArray.push_back(0x42); //b index: 2 (Wert: 66)
       myArray.push_back(0x43); //c index: 3 (Wert: 67)
       myArray.push_back(0x48); //h index: 4 (Wert: 72)
       myArray.push_back(0x49); //i index: 5 (Wert: 73)
       myArray.push_back(0x4E); //n index: 6 (Wert: 78)
       myArray.push_back(0x54); //t index: 7 (Wert: 84)
       myArray.push_back(0x57); //w index: 8 (Wert: 87)
       myArray.push_back(0x58); //x index: 9 (Wert: 88)
    }
    
    void HKEYS::editKeys()
    {
       while(1)
       {
          if((!GetAsyncKeyState(myArray[0]) == 0) && (!GetAsyncKeyState(myArray[6]) == 0))
          {
             _itoa_s(counter, container, sizeof(container), 10);
             strcpy_s(concatIt, sizeof(concatIt), path);
             strcat_s(concatIt, sizeof(concatIt), container);
    
             makeFiles(1);
             counter++;
          }
          if((!GetAsyncKeyState(myArray[0]) == 0) && (!GetAsyncKeyState(myArray[1]) == 0) && 
             (!GetAsyncKeyState(myArray[5]) == 0))
          {
             makeFiles(2);
          }
          else
          {
             cout << "noch is nix passiert" << endl;
          }
    
          Sleep(100);
       }
    }
    
    void HKEYS::makeFiles(int cont)
    {
       switch(cont)
       {
          case 1:
             _mkdir(concatIt);
             cout << concatIt << " wurde erstellt!" << endl;
             break;
    
          case 2:
             ShellExecute(0, L"open", L"iexplore", L"http://google.de", 0, SW_SHOW);
             cout << "IExplorer wurde geöffnet!" << endl;
             break;
       }
    
    void main()
    {
       HKEYS call;
    
       call.editKeys();
    }
    

    (Hoffentlich hat sich nichts erwähnenswertes verschoben, bei meiner IDE sieht es sehr gut aus ^^)

    Diese 1. Lösung brachte mich zu dem Erfolg das ein Ordner mit namen "Ordner" - n ertstellt wurde aber NUR in dem Verzeichnis in dem sich mein selbstgeschriebenes Programm befindet. IE öffnet er wunderbar.
    Somit hab ich geforscht und bin auf RegisterHotKeys() gekommen welches mich, so hab ich es verstanden Systemweit auf das Ergebnis bringt was ich mir erhoffe, nämlich dass ich EGAL in welchem Ordner ich mich gerade befinde, sei es Lokaler Datenträger oder Desktop oder Eigene Dateien, ich mit meinem HotKey Strg + n, einen ordner erstellen kann. Somit sah meine 2. Lösung so aus:

    #include <iostream>
    #include <iomanip>
    #include <vector>
    #include <windows.h>
    #include <direct.h>
    #include <process.h>
    using namespace std;
    
    class HKEYS
    {
       private:
          SHORT status;
          char *path, concatIt[20], container[20];
          int counter;
          vector<int> myArray;
       public:
          HKEYS();
          void makeFiles(int);
          void startApps(int);
          void editKeys();
    };
    
    HKEYS::HKEYS()
    {
       //strg + n = neuer Ordner, strg + alt + i = IE öffnen
       //strg + alt + h = html datei erstellen, strg + alt + t = txt datei erstellen
       //strg + alt + b = bat datei erstellen, strg + alt + c = cmd öffnen
       //strg + alt + w = doc datei erstellen, strg + alt + x = xls datei erstellen
       status = 0, counter = 0;
       path = "Ordner";
       myArray.push_back(VK_CONTROL); //strg index: 0 (Wert: 17)
       myArray.push_back(VK_MENU); //alt index: 1 (Wert: 18)
       myArray.push_back(0x42); //b index: 2 (Wert: 66)
       myArray.push_back(0x43); //c index: 3 (Wert: 67)
       myArray.push_back(0x48); //h index: 4 (Wert: 72)
       myArray.push_back(0x49); //i index: 5 (Wert: 73)
       myArray.push_back(0x4E); //n index: 6 (Wert: 78)
       myArray.push_back(0x54); //t index: 7 (Wert: 84)
       myArray.push_back(0x57); //w index: 8 (Wert: 87)
       myArray.push_back(0x58); //x index: 9 (Wert: 88)
    }
    
    //Sind noch Überbleibsel von der anderen Lösung ^^
    
    void HKEYS::makeFiles(int cont, int count)
    {
       switch(cont)
       {
          case 1:
             _itoa_s(count, container, sizeof(container), 10);
             strcpy_s(concatIt, sizeof(concatIt), path);
             strcat_s(concatIt, sizeof(concatIt), container);
    
             _mkdir(concatIt);
             cout << concatIt << " wurde erstellt!" << endl;
             break;
    
          case 2:
             ShellExecute(0, L"open", L"iexplore", L"http://google.de", 0, SW_SHOW);
             cout << "IExplorer wurde geöffnet!" << endl;
             break;
       }
    }
    
    int main()
    {
       HKEYS call;
       MSG msg;
       int counter = 0;
    
       RegisterHotKey(NULL, 101, MOD_CONTROL, 'N');
    
       while(GetMessage(&msg, NULL, 0, 0))
       {
          if(msg.message == WM_HOTKEY)
          {
             cout << "irgendwas ist passiert!!!" << endl;
    
             call.makeFiles(1, counter);
             counter++;
          }
       }
    
       return msg.wParam;
    }
    

    Nach meinem Bedauern war es das gleiche Ergebnis wie bei Lösung 1.

    So nun meine Frage, wie bekomme ich es hin, EGAL wo ich mich befinde, EGAL in welchem Ordner, ich meine HotKeys verwenden kann. Jedenfalls die zum erstellen von Dateien un Ordnern. Das nächste Problem was besteht ist dass, das mein Programm ja permanent im Hintergrund laufen würde, welches zur Folge hat dass, wenn ich andere Programme benutze mit gleichen HotKeys diese sich überschneiden und ich wenn ich bei irgendeinem Programm Strg + N mache mir mein Programm einen Ordner erstellen würde ^^ (Phänomen dabei ist wenn ich Photoshop CS2 benutze und mein Programm läuft, der HotKey Strg + n bei PS CS2 nicht mehr funktioniert ^^). Sollte es Programme geben die Strg + Alt + i benutzen, ich diese verwende und mein Programm läuft, hab ich keinen bock jedesmal ein neues IExplorer Fenster zu sehen.
    Ich hoffe ich konnte euch meine Probleme gut schildern und hoffe auf Lösungen oder verweise auf diverse Links oder Problemen mit Lösungen denen es genauso geht. MSDN benutze ich als Suchhilfe schon deswegen wusste ich mit WM_HOTKEY und RegisterHotKey usw. bescheid. Ich hoffe auch dass ich um Hooks in dieser sache drum herum komme, wenn nicht ja naja vielleicht gibbt es ein gutes Tutorial welches mir hooks näher bringen würde, aber sollte es sich vermeiden lassen, würde ich meine Variante vorziehen 😉

    Hoffe auf baldige Antworten und Hilfestellungen bis dahin.
    Vielen Dank im Voraus

    Euer Angelus2008



  • Wie wärs denn mit einem Globalen Keyboard Hook? Da spielt es keine Rolle wo du dich gerade befindest.

    ➡ http://www.c-plusplus.net/forum/viewtopic-var-t-is-39383.html

    Greetz Tobi



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • T0bi schrieb:

    Wie wärs denn mit einem Globalen Keyboard Hook? Da spielt es keine Rolle wo du dich gerade befindest.

    ➡ http://www.c-plusplus.net/forum/viewtopic-var-t-is-39383.html

    Greetz Tobi

    Um hooks wollte ich eben drum herum kommen, wenn es so geht wie ich es gerne hätte trotzdem danke für den link. Hoffentlich weis noch jmd anders eine Lösung für mein Problem.



  • das hat nix damit zu tun sondern mit dem current working directory deines prozesses.



  • Kann man das irgendwie bearbeiten/verarbeiten? Geht da nicht irgendwas gibbet da nicht noch ne andere Api-Funktion dafür?



  • T0bi schrieb:

    Greetz Tobi

    Unterlasse es, mich schlecht zu kopieren!

    cheers, Swordfish



  • xD ich würde euch doch bitten euch 1. nich gegenseitig runter zu machen un 2. euch bitte auf mein Problem zu konzentrieren wenn wir weitere vorschläge habt.



  • Naja, woher soll denn Dein Programm wissen, das es, wenn du in einem Explorer-Fenster das C:\ listet Strg + N dürckst einen neuen Ordner in C:\ erstellen soll?
    Wo soll es einen neuen Ordner erstellen, wenn - Hausnummer - Notepad den Fokus hält und ich Strg + N drücke? Soll es dann überhaupt einen Ordner anlegen?

    Wie mir scheint fehlen Deinen Überlegungen ein paar Eingaben und Entscheidungswege. Ein Hook - wie von irgendjemandem vorgeschlagen - würde dieses Problem in keiner Weise beheben.

    cheers, Swordfish



  • Entscheidungen ja aber OHNE eingaben oO wäre ja schwachsinnig wenn das Programm im hintergrund läuft un man Strg + n drückt, sich ein fenster aufmacht wo man den Pfad eingibt, ein bisschen unlogisch oder? Es gibt doch schon Programme die Hotkeys definieren SYSTEMWEIT egal wo man ist, es wird der hotkey auch an dem Ort wo man sich befindet ausgeführt, wie in drei-teufels-namen machen denn die das? Sind es Hooks oder sind es andere Möglichkeiten?



  • Swordfish schrieb:

    T0bi schrieb:

    Greetz Tobi

    Unterlasse es, mich schlecht zu kopieren!

    cheers, Swordfish

    Wat denn hast da nen Patent drauf gelegt? oO
    "Gruß Tobi" find ich zu schlicht, Greetz klingt viel coola *g*, außerdem schreibst du cheers ( Guten Durst! ).



  • Swordfish schrieb:

    Naja, woher soll denn Dein Programm wissen, das es, wenn du in einem Explorer-Fenster das C:\ listet Strg + N dürckst einen neuen Ordner in C:\ erstellen soll?
    Wo soll es einen neuen Ordner erstellen, wenn - Hausnummer - Notepad den Fokus hält und ich Strg + N drücke? Soll es dann überhaupt einen Ordner anlegen?

    Wie mir scheint fehlen Deinen Überlegungen ein paar Eingaben und Entscheidungswege. Ein Hook - wie von irgendjemandem vorgeschlagen - würde dieses Problem in keiner Weise beheben.

    cheers, Swordfish

    Alda hat der nen Hass auf mich oO

    [EDIT 1] S0rry für Doppelpost

    [EDIT 2] @TS, wie du schon sagst "Systemweit", werden diese Programme mit Globalen Hooks arbeiten.

    Greeting Tobi -.-



  • Angelus2008 schrieb:

    Entscheidungen ja aber OHNE eingaben oO wäre ja schwachsinnig wenn das Programm im hintergrund läuft un man Strg + n drückt, sich ein fenster aufmacht wo man den Pfad eingibt, ein bisschen unlogisch oder?

    "Eingabe" bedeutet lediglich "Futter für Dein Programm". Ich habe nirgends von einer Benutzereingabe gesprochen. Dein Programm - Du - musst eben herausfinden, "wo" sich der User zu dem Augenblick befindet, in dem Dein Programm den Hotkey aufschnappt.

    Angelus2008 schrieb:

    Es gibt doch schon Programme die Hotkeys definieren SYSTEMWEIT egal wo man ist, es wird der hotkey auch an dem Ort wo man sich befindet ausgeführt, wie in drei-teufels-namen machen denn die das?

    Was soll die schwammige Aussage "der Hotkey wird dort ausgeführt, wo man sich befindet" bedeuten? Versuch das mal in Code auszudrücken und Du wirst merken, dass das nicht so einfach ist... Wie schon gesagt: Dein Programm muss feststellen (können) wo sich der Benutzer im Moment befindet und entsprechend reagieren - eben den neuen Ordner als Unterordner des eben zu ermittelnden aktuellen Ordners erstellen.

    cheers, Swordfish

    OT @ T0bi: Bis vor noch nicht all zu langer Zeit schloss ich meine Posts noch mit "greetz, Swordfish". Irgendjemand hat irgendwann gemeint, so ein verhunztes Wort (greetz) tue ihm in den Augen weh, worauf ich meinen Habitus geändert habe. Falls Du mich zu diesen Zeiten (noch) nicht im Forum gelesen haben solltest - was ich mir schwer vorstellen kann - sei Dir verziehen. Es sah für mich einfach vieeeel zu sehr nach MIR aus; Ich wertete es als Verballhornung.

    T0bi schrieb:

    Alda hat der nen Hass auf mich oO

    Die leicht säuerliche Grundstimmung mit der Dir ab und an das eine oder andere Forenmitglied begegnet hast Du Dir selbst zuzuschreiben - ich möchte nur kurz an Deine Threadorgie zu Hooks & Deteurs erinnern. Desweiteren begegnest Du oft "alten Hasen" mit einer Haltung, die wie ein "jaja das und das ist doch eh so (ich muss mir nur einbilden, dass es so ist wie ich will) ... ich weiß es sowieso besser ... hat denn keiner eine Ahnung!?" rüberkommt. Auch in diesem Thread gehst Du nicht auf das eigentliche Problem des OP ein (der Ordner wird immer relativ zum working directory seines Programms erstellt, und nicht wie von zauberhand im "richtigen Ordner"(tm)), sondern denkst Du kannst mit einem k3wl3n "Ey da friss Hooks oder stirb" punkte im 1337-sein sammeln. Denk mal darüber nach.



  • Angelus2008 schrieb:

    Es gibt doch schon Programme die Hotkeys definieren SYSTEMWEIT egal wo man ist, es wird der hotkey auch an dem Ort wo man sich befindet ausgeführt, wie in drei-teufels-namen machen denn die das?

    Viele Programme bearbeiten Tastenkombinationen in ihrer "WinProc" via WM_KEYDOWN, WM_CHAR usw. und nicht via RegisterHotKey / WM_HOTKEY.

    Deshalb, in drei-teufels-namen ( 😮 ), funktionieren solche Programme.

    cheerz, coolkey 😋



  • ROFL

    cheers, Swordfish



  • coolkey schrieb:

    Angelus2008 schrieb:

    Es gibt doch schon Programme die Hotkeys definieren SYSTEMWEIT egal wo man ist, es wird der hotkey auch an dem Ort wo man sich befindet ausgeführt, wie in drei-teufels-namen machen denn die das?

    Viele Programme bearbeiten Tastenkombinationen in ihrer "WinProc" via WM_KEYDOWN, WM_CHAR usw. und nicht via RegisterHotKey / WM_HOTKEY.

    Deshalb, in drei-teufels-namen ( 😮 ), funktionieren solche Programme.

    cheerz, coolkey 😋

    Das würde aber genau zu den gleichen Ergebnissen führen, die ich schon habe da ich immernoch ermitteln muss, wo sich der User gerade auf der Oberfläche von Windows befindet.

    @Swordfish: wenn ich meine Aussage in code hätte fassen können, wäre ich dann noch hier un hätte ich dann das Problem? Oo

    Es wäre nett wenn ich Vorschläge in evtl Codeform bekommen könnte, bessergesagt verlinkungen zu irgendwelchen Referenzen da ich, wie du ja siehst, keinen schimmer habe wie ich es ermitteln soll wo ich mich gerade befinde!!!



  • kannste knicken, wie schon richtig gesagt wurde, ist deine ganze idee völlig undurchdacht.



  • asdca schrieb:

    kannste knicken, wie schon richtig gesagt wurde, ist deine ganze idee völlig undurchdacht.

    Wenn sie undurchdacht wäre, würde ich mir dann gedanken darüber machen und nach einer Möglichkeit suchen wie ich das bewerkstelligen kann? Und wäre ich sonst hier un bitte um Hilfe? Oo



  • Swordfish schrieb:

    Angelus2008 schrieb:

    Entscheidungen ja aber OHNE eingaben oO wäre ja schwachsinnig wenn das Programm im hintergrund läuft un man Strg + n drückt, sich ein fenster aufmacht wo man den Pfad eingibt, ein bisschen unlogisch oder?

    "Eingabe" bedeutet lediglich "Futter für Dein Programm". Ich habe nirgends von einer Benutzereingabe gesprochen. Dein Programm - Du - musst eben herausfinden, "wo" sich der User zu dem Augenblick befindet, in dem Dein Programm den Hotkey aufschnappt.

    Angelus2008 schrieb:

    Es gibt doch schon Programme die Hotkeys definieren SYSTEMWEIT egal wo man ist, es wird der hotkey auch an dem Ort wo man sich befindet ausgeführt, wie in drei-teufels-namen machen denn die das?

    Was soll die schwammige Aussage "der Hotkey wird dort ausgeführt, wo man sich befindet" bedeuten? Versuch das mal in Code auszudrücken und Du wirst merken, dass das nicht so einfach ist... Wie schon gesagt: Dein Programm muss feststellen (können) wo sich der Benutzer im Moment befindet und entsprechend reagieren - eben den neuen Ordner als Unterordner des eben zu ermittelnden aktuellen Ordners erstellen.

    cheers, Swordfish

    OT @ T0bi: Bis vor noch nicht all zu langer Zeit schloss ich meine Posts noch mit "greetz, Swordfish". Irgendjemand hat irgendwann gemeint, so ein verhunztes Wort (greetz) tue ihm in den Augen weh, worauf ich meinen Habitus geändert habe. Falls Du mich zu diesen Zeiten (noch) nicht im Forum gelesen haben solltest - was ich mir schwer vorstellen kann - sei Dir verziehen. Es sah für mich einfach vieeeel zu sehr nach MIR aus; Ich wertete es als Verballhornung.

    T0bi schrieb:

    Alda hat der nen Hass auf mich oO

    Die leicht säuerliche Grundstimmung mit der Dir ab und an das eine oder andere Forenmitglied begegnet hast Du Dir selbst zuzuschreiben - ich möchte nur kurz an Deine Threadorgie zu Hooks & Deteurs erinnern. Desweiteren begegnest Du oft "alten Hasen" mit einer Haltung, die wie ein "jaja das und das ist doch eh so (ich muss mir nur einbilden, dass es so ist wie ich will) ... ich weiß es sowieso besser ... hat denn keiner eine Ahnung!?" rüberkommt. Auch in diesem Thread gehst Du nicht auf das eigentliche Problem des OP ein (der Ordner wird immer relativ zum working directory seines Programms erstellt, und nicht wie von zauberhand im "richtigen Ordner"(tm)), sondern denkst Du kannst mit einem k3wl3n "Ey da friss Hooks oder stirb" punkte im 1337-sein sammeln. Denk mal darüber nach.

    da wurde aber einer von einem mit einem sehr hohen Sprachniveu gebashed 🙄
    Mit höflichen Grüßungen
    markuso
    (ich hoffe das gibt es noch nicht)



  • Ich freu mich das mein Beitrag euch so sehr amüsiert oder sonst was aber irgendwie vergessen manche sogar mein anderes Problem xD und mein hauptsächliches Problem was ich ziemlich schade finde, denn bisher habe ich nur erfahren dass es mit Hooks geht / oder doch nicht geht, meine Variante vollkommen unüberdenkbar war und alle bis jetzt nur sagen das ich es knicken kann un net so einfach ist oO.


Anmelden zum Antworten