# C++ linke MausTaste abfragen ?



## xFile (3. Dezember 2004)

Hallo...
ich hätte da mal ein Problem was mich schon längere Zeit beschäftigt!
Liegt wohl daran, dass ich bis heute noch nix gefunden habe, was mir dabei weiter helfen würde ;-(

Problem:
Ich möchte gern ein KonsolenProgramm (C++) erstellen das eine Aktion durchführt, wenn z.B. die linke Maustaste gedrückt wird.
Nun ist mein Problem, dass ich kein(e) Befehl/Funktion finde die die "Abfrage" übernimmt.
...alles was ich z.B. unter Google gefunden habe, hat sofort was mit API/MFC zu tun.

Gibts da nicht etwas, dass na diesem Prinzip funktionieren würde:

---------------------------------------------------------------------

```
int a=0;
...
while(a=0)
{
if (linke maustaste *down*)
a=1;
 
else
a=0;
}
cout<<" Maustaste wurde gedrückt";
...
```

---------------------------------------------------------------------

sprich: mache dies, wenn linke maustaste gedrückt wurde...

Vielen Dank schonmal
Mfg
adam


----------



## dorado (3. Dezember 2004)

Dazu musst du dir eine Konsolenhandle holen und dann auf die entsprechenden Mouseevents abfragen.
Hier noch ein kurzes Beispiel dazu.


```
#include "windows.h"
#include "wincon.h"
int main(int argc, char* argv[])
{
INPUT_RECORD inRec;
 
HANDLE hcon = GetStdHandle(STD_INPUT_HANDLE);
 
while(1)
{
DWORD nCnt = 0;
BOOL bOK = ReadConsoleInput(hcon, &inRec, 1, &nCnt);
if(bOK && nCnt == 1)
{
if(inRec.EventType == MOUSE_EVENT)
{
if(inRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
printf(" Left Mouse Button pressed \n");
}
}
}
 
 
	return 0;
}
```


----------



## xFile (3. Dezember 2004)

Erstmal danke an "dorado"...
Jedoch habe ich grade dieses kurze Beispiel ausprobiert & mein Compiler meldet mir
83 Fehler in der [wincon.h].

Erstellungsprotokoll:
--------------------Konfiguration: mouse - Win32 Debug--------------------

Befehlszeilen
Erstellen der temporären Datei  "C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\RSP135.tmp" mit Inhalten
[
/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"Debug/mouse.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c 
"D:\Programmieren\C++\Projekte\mouse\main.cpp"
]
Creating command line "cl.exe @C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\RSP135.tmp" 
Erstellen der temporären Datei  "C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\RSP136.tmp" mit Inhalten
[
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"Debug/mouse.pdb" /debug /machine:I386 /out:"Debug/mouse.exe" /pdbtype:sept 
".\Debug\main.obj"
]
Erstellen der Befehlzeile "link.exe @C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\RSP136.tmp"
Ausgabefenster
Kompilierung läuft...
main.cpp
d:\programmieren\c++\projekte\mouse\wincon.h(30) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'X'
d:\programmieren\c++\projekte\mouse\wincon.h(30) : error C2501: 'SHORT' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(30) : error C2501: 'X' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(31) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'Y'
d:\programmieren\c++\projekte\mouse\wincon.h(31) : error C2501: 'SHORT' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(31) : error C2501: 'Y' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(35) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'Left'
d:\programmieren\c++\projekte\mouse\wincon.h(35) : error C2501: 'SHORT' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(35) : error C2501: 'Left' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(36) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'Top'
d:\programmieren\c++\projekte\mouse\wincon.h(36) : error C2501: 'SHORT' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(36) : error C2501: 'Top' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(37) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'Right'
d:\programmieren\c++\projekte\mouse\wincon.h(37) : error C2501: 'SHORT' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(37) : error C2501: 'Right' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(38) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'Bottom'
d:\programmieren\c++\projekte\mouse\wincon.h(38) : error C2501: 'SHORT' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(38) : error C2501: 'Bottom' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(42) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'bKeyDown'
d:\programmieren\c++\projekte\mouse\wincon.h(42) : error C2501: 'BOOL' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(42) : error C2501: 'bKeyDown' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(43) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'wRepeatCount'
d:\programmieren\c++\projekte\mouse\wincon.h(43) : error C2501: 'WORD' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(43) : error C2501: 'wRepeatCount' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(44) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'wVirtualKeyCode'
d:\programmieren\c++\projekte\mouse\wincon.h(44) : error C2501: 'WORD' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(44) : error C2501: 'wVirtualKeyCode' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(45) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'wVirtualScanCode'
d:\programmieren\c++\projekte\mouse\wincon.h(45) : error C2501: 'WORD' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(45) : error C2501: 'wVirtualScanCode' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(47) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'UnicodeChar'
d:\programmieren\c++\projekte\mouse\wincon.h(47) : error C2501: 'WCHAR' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(47) : error C2501: 'UnicodeChar' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(48) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'AsciiChar'
d:\programmieren\c++\projekte\mouse\wincon.h(48) : error C2501: 'CHAR' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(48) : error C2501: 'AsciiChar' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(50) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'dwControlKeyState'
d:\programmieren\c++\projekte\mouse\wincon.h(50) : error C2501: 'DWORD' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(50) : error C2501: 'dwControlKeyState' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(76) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'dwButtonState'
d:\programmieren\c++\projekte\mouse\wincon.h(76) : error C2501: 'DWORD' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(76) : error C2501: 'dwButtonState' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(77) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'dwControlKeyState'
d:\programmieren\c++\projekte\mouse\wincon.h(77) : error C2501: 'DWORD' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(77) : error C2501: 'dwControlKeyState' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(78) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'dwEventFlags'
d:\programmieren\c++\projekte\mouse\wincon.h(78) : error C2501: 'DWORD' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(78) : error C2501: 'dwEventFlags' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(104) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'dwCommandId'
d:\programmieren\c++\projekte\mouse\wincon.h(104) : error C2501: 'UINT' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(104) : error C2501: 'dwCommandId' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(108) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'bSetFocus'
d:\programmieren\c++\projekte\mouse\wincon.h(108) : error C2501: 'BOOL' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(108) : error C2501: 'bSetFocus' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(112) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'EventType'
d:\programmieren\c++\projekte\mouse\wincon.h(112) : error C2501: 'WORD' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(112) : error C2501: 'EventType' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(134) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'UnicodeChar'
d:\programmieren\c++\projekte\mouse\wincon.h(134) : error C2501: 'WCHAR' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(134) : error C2501: 'UnicodeChar' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(135) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'AsciiChar'
d:\programmieren\c++\projekte\mouse\wincon.h(135) : error C2501: 'CHAR' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(135) : error C2501: 'AsciiChar' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(137) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'Attributes'
d:\programmieren\c++\projekte\mouse\wincon.h(137) : error C2501: 'WORD' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(137) : error C2501: 'Attributes' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(166) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'wAttributes'
d:\programmieren\c++\projekte\mouse\wincon.h(166) : error C2501: 'WORD' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(166) : error C2501: 'wAttributes' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(172) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'dwSize'
d:\programmieren\c++\projekte\mouse\wincon.h(172) : error C2501: 'DWORD' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(172) : error C2501: 'dwSize' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(173) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'bVisible'
d:\programmieren\c++\projekte\mouse\wincon.h(173) : error C2501: 'BOOL' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(173) : error C2501: 'bVisible' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(182) : error C2065: 'WINAPI' : nichtdeklarierter Bezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(182) : error C2065: 'PHANDLER_ROUTINE' : nichtdeklarierter Bezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(182) : error C2501: 'BOOL' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(182) : error C2143: Syntaxfehler : Fehlendes ';' vor '('
d:\programmieren\c++\projekte\mouse\wincon.h(184) : error C2146: Syntaxfehler : Fehlendes ')' vor Bezeichner 'CtrlType'
d:\programmieren\c++\projekte\mouse\wincon.h(184) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'CtrlType'
d:\programmieren\c++\projekte\mouse\wincon.h(184) : error C2501: 'DWORD' : Fehlende Speicherklasse oder Typbezeichner
d:\programmieren\c++\projekte\mouse\wincon.h(184) : fatal error C1004: Unerwartetes Dateiende gefunden
Fehler beim Ausführen von cl.exe.



Ergebnisse
mouse.exe - 83 Fehler, 0 Warnung(en)


----------



## dorado (3. Dezember 2004)

Sorry  
noch die windows.h einbinden


----------



## xFile (3. Dezember 2004)

*FREU*
...so gehts endlich!

--------------------------------------------------
#include <windows.h>
#include <iostream.h>
#include <wincon.h>

int main(int argc, char* argv[])
{
INPUT_RECORD inRec;

HANDLE hcon = GetStdHandle(STD_INPUT_HANDLE);

while(1)
{
DWORD nCnt = 0;
BOOL bOK = ReadConsoleInput(hcon, &inRec, 1, &nCnt);

if(bOK && nCnt == 1)
{
if(inRec.EventType == MOUSE_EVENT)
{
if(inRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
cout<<" Left Mouse Button pressed"<<endl;
}
}
}

return 0;
}

--------------------------------------------------

VIELEN DANK!


----------



## xFile (3. Dezember 2004)

...Dieses Beispiel funktioniert zwar einwandfrei, jedoch funktioniert die Abfrage nur innerhalb der Konsole.
Habe mir auch schon die dazu gehörige Funktion geschrieben um die Mausposition zu ermitteln.

Wie bekomme ich es jetzt hin, wenn die Konsole im Hintergrund läuft...

-----
const bool HideConsole () 
{ 
return ( ShowWindow ( GetConsoleWindow () , SW_HIDE ) && true ); 
} 
-----

dass sie immer noch die *Mausklicks* abfängt.

Ablauf-Beispiel:
1- Konsolenprogramm läuft im Hintergrund
2- ich klicke z.b.: auf "Start" [Taskleiste] es öffnet sich das "Startmenü"
3- das Konsolenprogramm [im Hintergrund] bekommt dies mit, da:
-> Mausklick wurde ausgelöst & Mausposition stimmt auch
4- Ausgabe: "Es wurde auf START geklickt"

Ich hoffe das ich nicht zuviel verlange


----------



## dorado (3. Dezember 2004)

Das ist etwas anderes. Deiner Beschreibung nach hatte ich angenommen, du willst nur in die Events deiner Applikation bearbeiten.  

Um systemweit die Mouseevents abzufangen musst du einen Windows Hook installieren, der die Mouseevents erhält. Dazu solltest du dir auf jeden Fall die Hilfe und Samples dazu ansehen. 
Unter den folgenden Begriffen findest du sicher etwas: 
Hook Functions, SetWindowsHookEx, LowLevelMouseProc, UnHookWindowsHookEx

Ich denke auch, dass hier im Forum schon einiges darüber steht.

Gruss  
  Dora


----------



## gnomecoder (29. November 2007)

Hi,
mit Hilfe dieser Funktion hab ich mir mal was gebastelt...


```
#include <windows.h>
#include <iostream>
#include <conio.h>
using namespace std;

using namespace std;


int main()
{
    cout << "Click @ this ---->    O" << endl;
    
    
    INPUT_RECORD inRec;
    HANDLE hcon = GetStdHandle(STD_INPUT_HANDLE);
    RECT *rect = (RECT*)malloc(sizeof(RECT));
    POINT mPos;
    int mPosinConsleX = mPos.x - (rect->left);
    int mPosinConsleY = mPos.y - (rect->top);
    
    HWND hwnd = FindWindow("ConsoleWindowClass",NULL);
    

   
    while(true)
    {
       GetCursorPos(&mPos);
       GetWindowRect(hwnd,rect);
       mPosinConsleY = mPos.y - (rect->top);
       mPosinConsleX = mPos.x - (rect->left);
       //cout << "X = " << mPosinConsleX << "   Y = " << mPosinConsleY << endl;
       if (mPosinConsleX > 180 && mPosinConsleX < 190)
       {
          if (mPosinConsleY > 32 && mPosinConsleY < 41)
          {
             DWORD nCnt = 0;
             BOOL bOK = ReadConsoleInput(hcon, &inRec, 1, &nCnt);
             if(bOK && nCnt == 1)
             {
                if(inRec.EventType == MOUSE_EVENT)
                {
                   if(inRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
                   cout << "Du hast auf den Kreis gedrueckt" << endl;

                }
              }   
           }   
       }
       //system("cls");
    } 

    

    getch();
    return 0;
}
```
Also wenn man auf den Kreis drückt, soll da  halt dieser Satz ausgegeben werden, klappt auch wunderbar, aber wenn ich erstmal irgentwo hinklicke, und dann erst die Maus auf dem Kreis tu, wird auch der Satz ausgegeben. 
Kann man Das irgenwie verhindern? 
Also nur wenn tatsächlich auf den Kreis geklickt wird soll auch die Meldung kommen.
mfg


----------

