Erkennen mehrer Mäuse und Event triggern
-
Hey zusammen, ich wurde vom C++ Forum hierher geschickt,
Programmieren ist nicht mein Fachgebiet. Jetzt hat sich allerdings eine Gelegenheit geboten mich damit etwas mehr zu beschäftigen. Ich habe folgendes Problem:
Ein Computer (Windows oder Linux) hat mehrer USB Anschlüsse. An jedem hängt eine Maus.Ich möchte jetzt gerne je nachdem welche Maus bewegt wird unterschiedliche Events triggern.
Also Maus 1 wird bewegt, Event 1 triggern
Maus 2 wird bewegt, Event 2 triggern, usw...Wie gehe ich da am besten vor? Ich bin nach einigen Recherchen auf WM_INPUT gestossen. Bin ich da auf dem richtigen Weg?
Wie würdet ihr Profis das angehen?
Grüsse
sgli
-
Bin ich da auf dem richtigen Weg?
Ich denke ja.
Mit "Raw Input" (->WM_INPUT
) sollte das auf Windows gehen.
In derRAWINPUTHEADER
Struktur hast du nen Handle auf das Device von dem die Nachricht generiert wurde.
Damit sollte man mehrere Mäuse auseinanderhalten können.Wie würdet ihr Profis das angehen?
Einfach mal ne Proof-Of-Concept Implementierung (=schneller, dreckiger Hack) mit "Raw Input" bauen, zwei Mäuse anhängen, und gucken ob es dann geht.
Bzw. das selbe auf Linux mit einer dort verfügbaren API. (Welche das sein könnte kann ich dir nicht sagen, ich hab von Linux-Systemprogrammierung genau keinen Tau.)Wenn's nicht funktioniert weinen gehen, nächste API die funktionieren könnte raussuchen und/oder in einem Forum nachfragen mit welcher API es gehen könnte. Repeat.
Und wenn man alle APIs durch ist nochmal extra weinen gehen und sich dann ne andere Aufgabe suchen.
Bzw. wenn man was gefunden hat was funktioniert freuen gehen, und dann nochmal ne saubere Implementierung davon schreiben.
ps: die alberne Formulierung im 2. Teil hier ist bitte NICHT als Veräppelung deiner Person bzw. deines Beitrags zu verstehen. Ich bin grad einfach nur "lusig" drauf.
Dein Beitrag/deine Frage war freundlich und verständlich formuliert, insgesamt eher ein Grund Lob auszusprechen als jmd. zu veräppeln.
Nur damit's hier keine Misverständnisse gibt deswegen.
-
Vielen Dank für die Antwort. Und keine Sorge, ich schätze den Inhalt einer Antwort mehr als die Art wie sie präsentiert wird
Auf das Risiko hin das ich mich jetzt völlig diskreditiere: Ich glaube ich packs nicht. Mir fehlt wohl ganz einfach die Erfahrung.
Im Internet finden sich ja so einige Beispiele wie Rawinput gelesen wird. Allerdings funktionieren all diese Beispiele bei mir nicht. Das liegt bestimmt an meiner Unwissenheit und nicht am Code. So wie es scheint ist es nicht Praxis headerstatements zu den Beispielen mitzuliefern. (z.B. #include <windows.h>)
Gibt es jemand hier der möglicherweise bereits einen gut dokumentierten Code hat der ähnliches macht?
Zur Info: Ich benutze die Dev-cpp IDE.
Danke
sgli
-
sgli schrieb:
Im Internet finden sich ja so einige Beispiele wie Rawinput gelesen wird. Allerdings funktionieren all diese Beispiele bei mir nicht.
Wie wärs wenn du die gefundenen Beispiele mal hier listen würdest (mit Titel und Link) und etwas genauer
beschreibst was daran nicht funktioniert. "Funktioniert nicht" ist für uns keine sinnvolle Aussage.
-
hustbaer schrieb:
Proof-Of-Concept Implementierung (=schneller, dreckiger Hack)
Jahahaha, bei dir vielleicht!
-
merano schrieb:
sgli schrieb:
Im Internet finden sich ja so einige Beispiele wie Rawinput gelesen wird. Allerdings funktionieren all diese Beispiele bei mir nicht.
Wie wärs wenn du die gefundenen Beispiele mal hier listen würdest (mit Titel und Link) und etwas genauer
beschreibst was daran nicht funktioniert. "Funktioniert nicht" ist für uns keine sinnvolle Aussage.Danke für die Antwort.
Ich hatte Probleme beim kompilieren von Codebeispielen in anderen Foren, wurde immer gemeldet das unqualified-id's fehlen, oder gewisse Sachen nicht definiert wurden.
Ich habe den Tag gestern damit verbracht die Grundlagen von c++ zu festigen. Hatte bisher nur (am Rande) mit Java zu tun.
Mein aktueller Stand ist der:
#include <windows.h> #include <iostream> #define _WIN32_WINNT 0x0400 #include <stdio.h> // Namespace using namespace std; // Main int main() { // Program cout << "USB Device Lister." << endl; // Get Number Of Devices UINT nDevices = 0; GetRawInputDeviceList( NULL, &nDevices, sizeof( RAWINPUTDEVICELIST ) ); // Got Any? if( nDevices < 1 ) { // Exit cout << "ERR: 0 Devices?"; cin.get(); return 0; } // Allocate Memory For Device List PRAWINPUTDEVICELIST pRawInputDeviceList; pRawInputDeviceList = new RAWINPUTDEVICELIST[ sizeof( RAWINPUTDEVICELIST ) * nDevices ]; // Got Memory? if( pRawInputDeviceList == NULL ) { // Error cout << "ERR: Could not allocate memory for Device List."; cin.get(); return 0; } // Fill Device List Buffer int nResult; nResult = GetRawInputDeviceList( pRawInputDeviceList, &nDevices, sizeof( RAWINPUTDEVICELIST ) ); // Got Device List? if( nResult < 0 ) { // Clean Up delete [] pRawInputDeviceList; // Error cout << "ERR: Could not get device list."; cin.get(); return 0; } // Loop Through Device List for( UINT i = 0; i < nDevices; i++ ) { // Get Character Count For Device Name UINT nBufferSize = 0; nResult = GetRawInputDeviceInfo( pRawInputDeviceList[i].hDevice, // Device RIDI_DEVICENAME, // Get Device Name NULL, // NO Buff, Want Count! &nBufferSize ); // Char Count Here! // Got Device Name? if( nResult < 0 ) { // Error cout << "ERR: Unable to get Device Name character count.. Moving to next device." << endl << endl; // Next continue; } // Allocate Memory For Device Name WCHAR* wcDeviceName = new WCHAR[ nBufferSize + 1 ]; // Got Memory if( wcDeviceName == NULL ) { // Error cout << "ERR: Unable to allocate memory for Device Name.. Moving to next device." << endl << endl; // Next continue; } // Get Name nResult = GetRawInputDeviceInfo( pRawInputDeviceList[i].hDevice, // Device RIDI_DEVICENAME, // Get Device Name wcDeviceName, // Get Name! &nBufferSize ); // Char Count // Got Device Name? if( nResult < 0 ) { // Error cout << "ERR: Unable to get Device Name.. Moving to next device." << endl << endl; // Clean Up delete [] wcDeviceName; // Next continue; } // Set Device Info & Buffer Size RID_DEVICE_INFO rdiDeviceInfo; rdiDeviceInfo.cbSize = sizeof( RID_DEVICE_INFO ); nBufferSize = rdiDeviceInfo.cbSize; // Get Device Info nResult = GetRawInputDeviceInfo( pRawInputDeviceList[i].hDevice, RIDI_DEVICEINFO, &rdiDeviceInfo, &nBufferSize ); // Got All Buffer? if( nResult < 0 ) { // Error cout << "ERR: Unable to read Device Info.. Moving to next device." << endl << endl; // Next continue; } // Mouse if( rdiDeviceInfo.dwType == RIM_TYPEMOUSE ) { // Current Device cout << endl << "Displaying device " << i+1 << " information. (MOUSE)" << endl; wcout << L"Device Name: " << wcDeviceName << endl; cout << "Mouse ID: " << rdiDeviceInfo.mouse.dwId << endl; cout << "Mouse buttons: " << rdiDeviceInfo.mouse.dwNumberOfButtons << endl; cout << "Mouse sample rate (Data Points): " << rdiDeviceInfo.mouse.dwSampleRate << endl; // if( rdiDeviceInfo.mouse.fHasHorizontalWheel ) //{ // cout << "Mouse has horizontal wheel" << endl; //} //else //{ // cout << "Mouse does not have horizontal wheel" << endl; //} } /* Keyboard else if( rdiDeviceInfo.dwType == RIM_TYPEKEYBOARD ) { // Current Device cout << endl << "Displaying device " << i+1 << " information. (KEYBOARD)" << endl; wcout << L"Device Name: " << wcDeviceName << endl; cout << "Keyboard mode: " << rdiDeviceInfo.keyboard.dwKeyboardMode << endl; cout << "Number of function keys: " << rdiDeviceInfo.keyboard.dwNumberOfFunctionKeys << endl; cout << "Number of indicators: " << rdiDeviceInfo.keyboard.dwNumberOfIndicators << endl; cout << "Number of keys total: " << rdiDeviceInfo.keyboard.dwNumberOfKeysTotal << endl; cout << "Type of the keyboard: " << rdiDeviceInfo.keyboard.dwType << endl; cout << "Subtype of the keyboard: " << rdiDeviceInfo.keyboard.dwSubType << endl; } // Some HID else // (rdi.dwType == RIM_TYPEHID) { // Current Device cout << endl << "Displaying device " << i+1 << " information. (HID)" << endl; wcout << L"Device Name: " << wcDeviceName << endl; cout << "Vendor Id:" << rdiDeviceInfo.hid.dwVendorId << endl; cout << "Product Id:" << rdiDeviceInfo.hid.dwProductId << endl; cout << "Version No:" << rdiDeviceInfo.hid.dwVersionNumber << endl; cout << "Usage for the device: " << rdiDeviceInfo.hid.usUsage << endl; cout << "Usage Page for the device: " << rdiDeviceInfo.hid.usUsagePage << endl; }*/ // Delete Name Memory! delete [] wcDeviceName; } // Clean Up - Free Memory delete [] pRawInputDeviceList; // Exit cout << endl << "Finnished."; cin.get(); return 0; }
Ich habe diesen Code nicht selber geschrieben. Er stammt aus einem OpenSource Projekt. Ich möchte aber mit diesem Code als Grundlage weitermachen.
Das Ziel ist noch immer:
Maus 1 bewegt, Trigger Event 1
Maus 2 bewegt, Trigger Event 2
Optional: Maus 1 + 2 bewegt, Trigger Event 3Irgendwelche Anmerkungen oder Tipps wie sich das am besten realisieren lässt?
Danke für die Hilfe.
-
@sgli
So jetzt haben wir den Code da stehen. Soweit so gut. Jetzt müssten wir noch wissen was für Probleme du damit hast.
-
Sorry wenn ich das unnötig in die länge ziehe
Also, dieser Code funktioniert einwandfrei. Er gibt mir aus wieviel Mäuse ich angeschlossen habe, mit entsprechender ID.
Das ganze muss ich jetzt allerdings erweitern damit das Programm in Echtzeit feststellt welche Maus sich bewegt und dann einen entsprechenden Event triggert (Anzeige von definierten Bilder).
Dieser Code den ich gepostet habe sehe ich als Grundlage für das weitere vorgehen, er stammt ja auch nicht von mir, dazu wäre ich vom Erfahrungsstand wahrscheinlich nicht in der Lage. Ich verstehe was der Code macht (denke ich). Das Programm dient am Ende nur als Proof-of-conept. Darum bin ich hier: Wie gehe ich das Problem jetzt am besten an? Damit das Programm in Echtzeit feststellt welche Maus bewegt wird muss ich ja wahrscheinlich an den richtigen stellen Schleifen einbauen.
Danach muss ich wohl die jeweils aktive ID in eine Variable speichern. Je nachdem welcher Wert drinne ist muss dann ein Event getriggert werden.
Einfach oder? Nicht für mich
-
sgli schrieb:
Sorry wenn ich das unnötig in die länge ziehe
Also, dieser Code funktioniert einwandfrei. Er gibt mir aus wieviel Mäuse ich angeschlossen habe, mit entsprechender ID.
Das ganze muss ich jetzt allerdings erweitern damit das Programm in Echtzeit feststellt welche Maus sich bewegt und dann einen entsprechenden Event triggert (Anzeige von definierten Bilder).
Dieser Code den ich gepostet habe sehe ich als Grundlage für das weitere vorgehen, er stammt ja auch nicht von mir, dazu wäre ich vom Erfahrungsstand wahrscheinlich nicht in der Lage. Ich verstehe was der Code macht (denke ich). Das Programm dient am Ende nur als Proof-of-conept. Darum bin ich hier: Wie gehe ich das Problem jetzt am besten an? Damit das Programm in Echtzeit feststellt welche Maus bewegt wird muss ich ja wahrscheinlich an den richtigen stellen Schleifen einbauen.
Danach muss ich wohl die jeweils aktive ID in eine Variable speichern. Je nachdem welcher Wert drinne ist muss dann ein Event getriggert werden.
Einfach oder? Nicht für mich
Der Code gibt zwar die Devicesinfos aller Mäuse aus, ich sehe allerdings keine Stelle an der die Position einer Maus
abgefragt wird - Das wäre aber notwendig. Wenn das mit dem aktuellen code nicht gegen sollte, hast Du schlicht kein "proof".Da das Betriebssystem die Geräte bereits geöffnet hat wäre es auch nicht ratsam dies nochmals zu versuchen (wenn es überhaupt geht..)
Alternativ wäre es evtl. ratsam sich an das bereits geöffnete Gerät dranzuhängen (Hook?) und/oder sich vom
Betriebssystem benachrichtigen zu lassen wenn sich eine der Mäuse bewegt. Ich habe das allerdngs auch noch nicht gemacht ...
-
Eventuell könnte es so gehen:
Using Raw Input
This sample shows how an application does an unbuffered (or standard) read of raw input from a mouse Human Interface Device (HID) and then prints out various information from the device.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms645546.aspx
case WM_INPUT: { UINT dwSize; GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER)); LPBYTE lpb = new BYTE[dwSize]; if (lpb == NULL) { return 0; } if (GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize ) OutputDebugString (TEXT("GetRawInputData does not return correct size !\n")); RAWINPUT* raw = (RAWINPUT*)lpb; if (raw->header.dwType == RIM_TYPEMOUSE) { hResult = StringCchPrintf(szTempOutput, STRSAFE_MAX_CCH, TEXT("Mouse: usFlags=%04x ulButtons=%04x usButtonFlags=%04x usButtonData=%04x ulRawButtons=%04x lLastX=%04x lLastY=%04x ulExtraInformation=%04x\r\n"), raw->data.mouse.usFlags, raw->data.mouse.ulButtons, raw->data.mouse.usButtonFlags, raw->data.mouse.usButtonData, raw->data.mouse.ulRawButtons, raw->data.mouse.lLastX, raw->data.mouse.lLastY, raw->data.mouse.ulExtraInformation); if (FAILED(hResult)) { // TODO: write error handler } OutputDebugString(szTempOutput); } delete[] lpb; return 0; }
-
merano schrieb:
Eventuell könnte es so gehen:
Using Raw Input
This sample shows how an application does an unbuffered (or standard) read of raw input from a mouse Human Interface Device (HID) and then prints out various information from the device.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms645546.aspx
case WM_INPUT: { UINT dwSize; GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER)); LPBYTE lpb = new BYTE[dwSize]; if (lpb == NULL) { return 0; } if (GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize ) OutputDebugString (TEXT("GetRawInputData does not return correct size !\n")); RAWINPUT* raw = (RAWINPUT*)lpb; if (raw->header.dwType == RIM_TYPEMOUSE) { hResult = StringCchPrintf(szTempOutput, STRSAFE_MAX_CCH, TEXT("Mouse: usFlags=%04x ulButtons=%04x usButtonFlags=%04x usButtonData=%04x ulRawButtons=%04x lLastX=%04x lLastY=%04x ulExtraInformation=%04x\r\n"), raw->data.mouse.usFlags, raw->data.mouse.ulButtons, raw->data.mouse.usButtonFlags, raw->data.mouse.usButtonData, raw->data.mouse.ulRawButtons, raw->data.mouse.lLastX, raw->data.mouse.lLastY, raw->data.mouse.ulExtraInformation); if (FAILED(hResult)) { // TODO: write error handler } OutputDebugString(szTempOutput); } delete[] lpb; return 0; }
Ok das habe ich auch schon gefunden. Leider habe ich es nicht geschafft den Code zum laufen zu bringen. Wenn ich ihn 1 zu 1 in cpp-dev einfüge und kompiliere bekomme ich immer Fehler.Übersehe ich da etwas?
Danke für die Hilfe
-
sgli schrieb:
Übersehe ich da etwas?
Ja, klar.
Das ist ja nur ein Code-Fragment, das kann so alleine nicht laufen.Dazu musst du erstmal ein Fenster anlegen damit du WM_INPUT empfangen kannst, und dann das OS bitten dir für die entsprechenden Geräte überhaupt WM_INPUT zu schicken. Wie das geht sieht man vermutlich in anderen Beispielen.
Bzw. wie man ein Fenster aufmacht wird wohl vorausgesetzt - das müsstest du dir evtl. aus den entsprechenden Fenster-API Beispielen raussuchen.
-
Da war der hustbaer mal wieder schneller
Hier noch mein Kommentar.
sgli schrieb:
Ok das habe ich auch schon gefunden. Leider habe ich es nicht geschafft den Code zum laufen zu bringen.
Wenn ich ihn 1 zu 1 in cpp-dev einfüge und kompiliere bekomme ich immer Fehler.Übersehe ich da etwas?Danke für die Hilfe
Wieder lässt Du uns raten was nicht geht ...
Ich weiss nicht was DevCpp im Detail anders macht als z.B. Visual-Studio. Meine Glaskugel sagt mir das Du vermutlich
versuchst den obigen Code in eine Konsolenanwendung einzubauen. Das Label WM_INPUT kommt jedoch eher in Verbingung
mit einer Win32 Applikation vor.PS: Wenn du nach WM_INPUT message suchen würdest wäre es Dir evtl. auch selbst aufgefallen.
-
hustbaer schrieb:
Dazu musst du erstmal ein Fenster anlegen damit du WM_INPUT empfangen kannst, und dann das OS bitten dir für die entsprechenden Geräte überhaupt WM_INPUT zu schicken.
Raw input is available only when the application calls RegisterRawInputDevices with valid device specifications
Zu finden ebenfalls unter dem Link den ich bereits mitgeteilt hatte ...
-
Leute, ihr seid mir eine grosse Hilfe. Tut mir leid wenn ich eure Nerven strapaziere.
Ich werde das nochmal ausarbeiten und melde mich dann nochmal.
Danke vielmals.
-
Habs aus Neugier gerade mal ausprobiert. Ich verwende ein leicht vereinfachtes Win32 Gerüst aus VisualStudio.
// Globale Variablen: HINSTANCE hInst; // Aktuelle Instanz TCHAR *szTitle = TEXT("Direktmouse"); // Titelleistentext TCHAR *szWindowClass = TEXT("DirektmouseClass"); // Klassenname des Hauptfensters // ------------------------------------------------------------------------- // FUNKTION: InitInstance(HINSTANCE, int) // ZWECK: Speichert das Instanzenhandle und erstellt das Hauptfenster. // ------------------------------------------------------------------------- BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // Instanzenhandle in der globalen Variablen speichern hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 50, 50, 450, 200, NULL, NULL, hInstance, NULL); if(!hWnd) { return FALSE; } RAWINPUTDEVICE Rid[1]; Rid[0].usUsagePage = 0x01; // 1 stands for "generic desktop controls" Rid[0].usUsage = 0x02; // 2 is mouse, 4 is joystick, 6 is keyboard Rid[0].dwFlags = 0; Rid[0].hwndTarget = hWnd; // handle to the target window. If NULL it follows the keyboard focus if(RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])) == FALSE) { //registration failed. Call GetLastError for the cause of the error } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; }
Hatte zunächst etwas geflucht, da das Fenster ziemlich tot war und nicht mehr auf die Maus reagierte. (Lösung dwFlags = 0)
Das Microsoft Beispiel scheint etwas unvollständig zu sein. Wenn ich die Doku richtig verstanden habe fehlt z.b. der Aufruf von DefWindowProc().
case WM_INPUT: { WPARAM code = GET_RAWINPUT_CODE_WPARAM(wParam); // Retrieve input code from wParam in WM_INPUT ... if(code == RIM_INPUT) return DefWindowProc(hWnd, message, wParam, lParam); else return 0; }
Ob oder wie das mit mehreren Mäusen läuft habe ich nicht untersucht.
-
Ok, danke, das sieht spannend aus.
Ich habe mir jetzt Visual Studio 12 installiert und den Code eingepflegt. Leider bekomme ich nur ein leeres Fenster zu sehen und Meldungen über fehlende PDB Dateien.
So sieht das Fenster aus: http://imgur.com/FsGKq71
Das sind die Meldungen die VS ausspuckt:
"Win32Project3.exe" (Win32): "C:\Windows\SysWOW64\ntdll.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden. "Win32Project3.exe" (Win32): "C:\Windows\SysWOW64\kernel32.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden. "Win32Project3.exe" (Win32): "C:\Windows\SysWOW64\KernelBase.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden. "Win32Project3.exe" (Win32): "C:\Windows\SysWOW64\user32.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden. "Win32Project3.exe" (Win32): "C:\Windows\SysWOW64\msvcr110d.dll" geladen. Symbole wurden geladen. "Win32Project3.exe" (Win32): "C:\Windows\SysWOW64\gdi32.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden. "Win32Project3.exe" (Win32): "C:\Windows\SysWOW64\imm32.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden. "Win32Project3.exe" (Win32): "C:\Windows\SysWOW64\msctf.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden. "Win32Project3.exe" (Win32): "C:\Windows\SysWOW64\msvcrt.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden. "Win32Project3.exe" (Win32): "C:\Windows\SysWOW64\uxtheme.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden. "Win32Project3.exe" (Win32): "C:\Windows\SysWOW64\dwmapi.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden. "Win32Project3.exe" (Win32): "C:\Windows\SysWOW64\ole32.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden. "Win32Project3.exe" (Win32): "C:\Windows\SysWOW64\combase.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden. "Win32Project3.exe" (Win32): "C:\Windows\SysWOW64\rpcrt4.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden. "Win32Project3.exe" (Win32): "C:\Windows\SysWOW64\sechost.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden. "Win32Project3.exe" (Win32): "C:\Windows\SysWOW64\sspicli.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden. "Win32Project3.exe" (Win32): "C:\Windows\SysWOW64\cryptbase.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden. "Win32Project3.exe" (Win32): "C:\Windows\SysWOW64\bcryptprimitives.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden. Das Programm "[6760] Win32Project3.exe" wurde mit Code 0 (0x0) beendet.
Code 1-zu-1 aus VS 12 übernommen:
// Win32Project3.cpp : Definiert den Einstiegspunkt für die Anwendung. // #include "stdafx.h" #include "Win32Project3.h" #define MAX_LOADSTRING 100 // Globale Variablen: HINSTANCE hInst; // Aktuelle Instanz TCHAR szTitle[MAX_LOADSTRING]; // Titelleistentext TCHAR szWindowClass[MAX_LOADSTRING]; // Klassenname des Hauptfensters // Vorwärtsdeklarationen der in diesem Codemodul enthaltenen Funktionen: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: Hier Code einfügen. MSG msg; HACCEL hAccelTable; // Globale Zeichenfolgen initialisieren LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_WIN32PROJECT3, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // Anwendungsinitialisierung ausführen: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32PROJECT3)); // Hauptnachrichtenschleife: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } // // FUNKTION: MyRegisterClass() // // ZWECK: Registriert die Fensterklasse. // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECT3)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32PROJECT3); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex); } // // FUNKTION: InitInstance(HINSTANCE, int) // // ZWECK: Speichert das Instanzenhandle und erstellt das Hauptfenster. // // KOMMENTARE: // // In dieser Funktion wird das Instanzenhandle in einer globalen Variablen gespeichert, und das // Hauptprogrammfenster wird erstellt und angezeigt. // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // Instanzenhandle in der globalen Variablen speichern hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 50, 50, 450, 200, NULL, NULL, hInstance, NULL); if(!hWnd) { return FALSE; } RAWINPUTDEVICE Rid[1]; Rid[0].usUsagePage = 0x01; // 1 stands for "generic desktop controls" Rid[0].usUsage = 0x02; // 2 is mouse, 4 is joystick, 6 is keyboard Rid[0].dwFlags = 0; Rid[0].hwndTarget = hWnd; // handle to the target window. If NULL it follows the keyboard focus if(RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])) == FALSE) { //registration failed. Call GetLastError for the cause of the error } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // // FUNKTION: WndProc(HWND, UINT, WPARAM, LPARAM) // // ZWECK: Verarbeitet Meldungen vom Hauptfenster. // // WM_COMMAND - Verarbeiten des Anwendungsmenüs // WM_PAINT - Zeichnen des Hauptfensters // WM_DESTROY - Beenden-Meldung anzeigen und zurückgeben // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Menüauswahl bearbeiten: switch (wmId) { case IDM_\1: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: Hier den Zeichnungscode hinzufügen. EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // Meldungshandler für Infofeld. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
Ich komme einem Ergebnis immer näher, toll
-
Sieht soweit richtig aus.
Die Stelle mit case WM_INPUT fehlt noch. Meine beiden Posts dazu kombinieren und
per Copy&Paste reinkopieren.Fehlende PDB Dateien sollten nicht weiter stören ...
-
Vielen Dank,
Kommt der WM_Input Teil zu "// Meldungshandler für Infofeld." oder "FUNKTION: WndProc(HWND, UINT, WPARAM, LPARAM)"
Dort wo du die drei punkte hingecshrieben hast komt was genau hin?
case WM_INPUT: { WPARAM code = GET_RAWINPUT_CODE_WPARAM(wParam); // Retrieve input code from wParam in WM_INPUT ... if(code == RIM_INPUT) return DefWindowProc(hWnd, message, wParam, lParam); else return 0; }
Danke
-
sgli schrieb:
Kommt der WM_Input Teil zu "// Meldungshandler für Infofeld." oder "FUNKTION: WndProc(HWND, UINT, WPARAM, LPARAM)"
In der Aboutbox macht es wohl wenig Sinn ...
sgli schrieb:
Dort wo du die drei punkte hingecshrieben hast komt was genau hin?
Ist das wirklich jetzt dein Ernst ??? Wenn ja, scheinen ja die einfachsten Grundlagen zu fehlen ...
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_INPUT: { WPARAM code = GET_RAWINPUT_CODE_WPARAM(wParam); // Retrieve input code from wParam in WM_INPUT UINT dwSize; GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER)); ... if(code == RIM_INPUT) return DefWindowProc(hWnd, message, wParam, lParam); else return 0; }
Dir ist aber schon klar, das wir etwas Eigeninitiative erwarten ?
Ich werde erst wieder was beisteuern wenn Du auch was anbietest ...