Hilfe bei Fehlersuche!



  • Hallo,

    ich habe in Sachen c++ noch nicht viele Ergebnisse nachzuweisen, aber ich gebe mein Bestes. Ich arbeite mit MVC++ 2008 Express Edition!
    Ich habe ein Programm geschrieben, doch beim kompilieren gibt es jedes Mal eine Fehlermeldung. Ich habe bereits die Suchfunktion benutzt - ohne Erfolg, sowie einige Foren. Ich hoffe, dass Ihr mir weiterhelfen könnt!

    Beim kompilieren zeigt sich folgender Fehler:

    Fehler 1 fatal error C1083: Datei (Include) kann nicht geöffnet werden: "Form.h": No such file or directory c:\Users\L\Desktop\Visual Studio 2008\Projects\Tastendruck-Simulation\Tastendruck-Simulation.cpp 3

    Hier der Quelltext (.cpp-Datei)

    // Tastendruck-Simulation.cpp: Hauptprojektdatei.
    
    #include <Form.h>
    
       void SetNumlock(BOOL bState)
    
       {
          BYTE keyState[256];
    
          GetKeyboardState((LPBYTE)&keyState);
          if( (bState && !(keyState[VK_NUMPAD3] & 1)) ||
              (!bState && (keyState[VK_NUMPAD3] & 1)) )
          {
          // Simulate a key press
             keybd_event( VK_NUMPAD3,
                          0x63,
                          KEYEVENTF_EXTENDEDKEY | 0,
                          0 );
    
          // Simulate a key release
             keybd_event( VK_NUMPAD3,
                          0x63,
                          KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                          0);
          }
       }
    
       void main()
       {
          SetNumLock( TRUE );
       }
    

    Zum Prgramm: Es soll ein Tastendruck (die Taste 3) simuliert werden!

    Ich bin für alle Antworten dankbar!



  • Was soll das "<form1.h>" sein?

    Warum nicht:
    #include <windows.h>
    !?



  • Wenn die Headerdatei Form.h heißt muss das doch so heißen, oder nicht?! Aber ich lasse mich auch eines Besseren belehren. Wenn ich das mit #include <windows.h> mache, ist der C1083 Fehler weg.

    Jetzt gibt es aber leider eine neue Fehlermeldung:

    Fehler 1 error C3861: "SetNumLock": Bezeichner wurde nicht gefunden.

    Das steht in Zeile 30: SetNumLock( TRUE );

    Danke für Deine schnelle Antwort! 🙂



  • C/C++ ist *Case-Sensitive*

    Schau mal wie Du es oben geschrieben hast und wie Du es unten schreibst... da gibt es einen Unterschied... beides muss aber genau gleich sein!



  • Ja! Wenn ich aber die Befehle gleich schriebe (also: SetNumlock bzw. beide SetNumLock - egal), dann bekomme ich wieder andere 5 Fehler:

    Fehler 4 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int __stdcall GetKeyboardState(unsigned char *)" (?GetKeyboardState@@$$J14YGHPAE@Z)" in Funktion ""void __clrcall SetNumlock(int)" (?SetNumlock@@$$FYMXH@Z)". Tastendruck-Simulation.obj

    Fehler 3 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" void __stdcall keybd_event(unsigned char,unsigned char,unsigned long,unsigned long)" (?keybd_event@@$$J216YGXEEKK@Z)" in Funktion ""void __clrcall SetNumlock(int)" (?SetNumlock@@$$FYMXH@Z)". Tastendruck-Simulation.obj

    Fehler 1 error LNK2028: Nicht aufgelöstes Token (0A00000A) ""extern "C" void __stdcall keybd_event(unsigned char,unsigned char,unsigned long,unsigned long)" (?keybd_event@@$$J216YGXEEKK@Z)", auf das in Funktion ""void __clrcall SetNumlock(int)" (?SetNumlock@@$$FYMXH@Z)" verwiesen wird. Tastendruck-Simulation.obj

    Fehler 2 error LNK2028: Nicht aufgelöstes Token (0A000019) ""extern "C" int __stdcall GetKeyboardState(unsigned char *)" (?GetKeyboardState@@$$J14YGHPAE@Z)", auf das in Funktion ""void __clrcall SetNumlock(int)" (?SetNumlock@@$$FYMXH@Z)" verwiesen wird. Tastendruck-Simulation.obj

    Fehler 5 fatal error LNK1120: 4 nicht aufgelöste externe Verweise.

    Externe Verweise? 😕



  • Dann bist Du aber immerhin schon mal einen Schritt weiter, da der Compiler keine Fehlermeldung gebracht hat!

    Mein Tipp: Lege ein neues Win32 Projekt an! Und kein .NET Projekt... dann beheben sich diese Fehler von alleine... oder füge noch ein

    #pragma comment(lib, "user32.lib")
    

    ganz oben ein...



  • Super, er kompiliert alles ohne Probleme! Danke 👍 🙂



  • Ich habe noch eine Frage: Wenn ich die obige .exe-Datei im Windows-Explorer öffnen will, dann öffnet sich kein Fenster, jedoch gibt es die Funktion. Die simulierte Taste 3 wird z.B. dann im normalen Editor oder bei Word geschrieben. Wie kann ich aus dem "Programm" (siehe unten) ein richtiges Fenster machen? Ich habe immernoch eine .NET-Datei!

    Eine Tastendrucksimulation soll das Ergebnis werden.

    #pragma comment(lib, "user32.lib")
    #include <windows.h>
    
       void SetNumlock(BOOL bState)
    
       {
          BYTE keyState[256];
    
          GetKeyboardState((LPBYTE)&keyState);
          if( (bState && !(keyState[VK_NUMPAD3] & 1)) ||
              (!bState && (keyState[VK_NUMPAD3] & 1)) )
          {
    
             keybd_event( VK_NUMPAD3,
                          0x63,
                          KEYEVENTF_EXTENDEDKEY | 0,
                          0 );
    
             keybd_event( VK_NUMPAD3,
                          0x63,
                          KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                          0);
          }
       }
    
       void main()
       {
          SetNumlock( TRUE );
       }
    

    Danke für alle Antworten! 🙂



  • Dann erstelle eine Windows-Forms Anwendung. Dort kannst Du dann einen Button einbauen und in den Event-Handler den Code aus Deiner "SetNumlock" einfügen.

    Beachte dabei aber auch: Wenn Du das Programm auf einem anderen Rechner laufen lassen willst, so musst Du diverse Dinge installieren:
    http://blog.kalmbach-software.de/de/2010/09/23/ccli-programme-auf-einem-anderen-rechner-ausfuhren-vc2010/



  • LaKo15 schrieb:

    Super, er kompiliert alles ohne Probleme! Danke 👍 🙂

    <klugscheiss>Hat er vorher doch auch schon.. nur gelinkt eben nicht...</klugscheiss>



  • Ich versuch es mal! 😉

    @theta: Das sieht mir aus wie HTML...



  • Dort kannst Du dann einen Button einbauen und in den Event-Handler den Code aus Deiner "SetNumlock" einfügen.

    ================================================================================

    Wo soll ich den Code einfügen (habe unten zwei Stellen markiert)?
    Ich habe es mal an einigen Stellen probiert (mit (BOOL bState)) aber dann erscheint eine Seite mit Warnungen etc.

    Und: Welchen Code genau; nur (BOOL bState) oder noch mehr?

    Hier steht die "Form1.h"-Datei, die den Button (button1) beinhaltet:

    #pragma once
    
    namespace TastenSimulator_v10 {
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    
    		}
    
    	protected:
    
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	private: System::Windows::Forms::Button^  button1;
    	protected: 
    
    	private:
    
    		System::ComponentModel::Container ^components;
    
    #pragma region Windows Form Designer generated code
    
    		void InitializeComponent(void)
    		{
    			this->button1 = (gcnew System::Windows::Forms::Button());
    			this->SuspendLayout();
    			// 
    			// button1
    			// 
    			this->button1->Location = System::Drawing::Point(33, 116);
    			this->button1->Name = L"button1";
    			this->button1->Size = System::Drawing::Size(219, 33);
    			this->button1->TabIndex = 0;
    			this->button1->Text = L"Klick mich!";
    			this->button1->UseVisualStyleBackColor = true;
    			// ~~~In dieser Zeile noch einen EventHandler-Code einfügen? / Wie?~~~
    
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(284, 264);
    			this->Controls->Add(this->button1);
    			this->Name = L"Form1";
    			this->ShowIcon = false;
    			this->Text = L"TastenSimulator_v1.0";
    			this->TopMost = true;
    			this->Load += gcnew System::EventHandler(this, &Form1::Form1::_Load); // ~~~In dieser Zeile?~~~
    			this->ResumeLayout(false);
    
    		}
    #pragma endregion
    	private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
    			 }
    	};
    }
    

    PS: Danke für den Link! 🙂


Anmelden zum Antworten