Announcement

Collapse
No announcement yet.

Windows Meldungen auslesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Windows Meldungen auslesen

    Hallo erstmal,
    Ich habe das Problem, dass ich ein Programm schreibe, das die Windows Sounds, von Fehlermeldungen und ähnlichem, registriert und per Knopfdruck nochmal abspielen kann. Das Programm soll im Hintergrund laufen und wenn ein Ereigniss eintritt, das einen Sound auslöst, dieses Ereigniss wiederholen können.
    z.B. ich habe für Fenster maximieren in der Systemsteuerung einen Sound ausgewählt, ich maximiere ein Fenster, der Sound kommt, ich klicke in meinem Programm auf den Knopf und der Sound kommt nochmal.

    Es soll aber nicht einfach die Sound datei mitloggen, also wenn ich bevor ich das programm ausführe den Sound zum eben verwendeten Ereigniss verändere soll der neue Sound kommen.

    Hört sich ziehmlich kompliziert an, aber eigentlich muss ich ja nur die Messages, die diese Sound auslösen, abfangen.

    Ps: das ganze soll mit C++ über die win32api geschehen(sofern möglich).

    Für all eure Hilfe danke ich schon mal im Vorraus,
    MfG Wolfram

  • #2
    Win32 API SetWindowsHookEx

    Eine DLL schreiben, die die Ereignisse abfängt
    Christian

    Comment


    • #3
      hmm...
      ein Hook is ne gute Idee, nur leider finde ich net raus mit welchem ich die Meldungen abfangen kann.

      Die meisten Hooks beziehen sich auf Hardware eingaben.

      Im Vorraus schon mal Danke für alle Antworten.

      MfG Wolfram

      Comment


      • #4
        Die meisten Hooks beziehen sich auf Hardware eingaben.
        ???
        http://msdn.microsoft.com/en-us/libr...90(VS.85).aspx

        -->>WH_MSGFILTER
        Christian

        Comment


        • #5
          Originally posted by Christian Marquardt View Post
          Erst mal danke für deine schnelle Antwort, aber sie hilft mir leider nicht weiter.
          Ich glaube ich habe ein 'bisschen' falsch gedacht, es gibt keine Funktion mit der man direkt solche Meldungen auslesen kann, zumindest nicht direkt, bzw ausschliesslich. (nach dem Motto: WH_SOUNDMSG )
          WH_MSGFILTER hab ich mir auch schon überlegt, aber aus der MSDN (WH_MSGFILTER, WH_SYSMSGFILTER) werd ich net schlau.

          Originally posted by MSDN
          WH_MSGFILTER
          Installs a hook procedure that monitors messages generated as a result of an input event in a dialog box, message box, menu, or scroll bar. For more information, see the MessageProc hook procedure.
          Ich will aber die Messages von allen/für alle Anwendungen (inklusive Windows), die eine Soundausabe zur folge haben können, auslesen und ggf. nochmal auslösen.

          MfG Wolfram

          Comment


          • #6
            sry

            WH_CALLWNDPROCRET

            Du bekommst alle Messages und kannst dann filtern
            Christian

            Comment


            • #7
              Mal wieder danke für die Hilfe, habs immerhin geschafft eine .dll zu erstellen und eine Konsolenanwendung die darauf zugreifen kann.
              Mein Code sieht so aus (nur leicht verändert aus der MSDN übernommen):
              die .cpp datei der .dll:
              Code:
              // compile with: /EHsc /LD
              
              #include "dllTestH.h"
              
              #include <stdexcept>
              #include <windows.h>
              
              typedef struct _MYHOOKDATA 
              {
                  int nType; 
                  HOOKPROC hkprc; 
                  HHOOK hhook; 
              } MYHOOKDATA; 
              
              
              
              using namespace std;
              
              MYHOOKDATA myhookdata[NUMHOOKS]; 
               
              LRESULT WINAPI MainWndProc(HWND hwndMain, UINT uMsg, WPARAM wParam, LPARAM lParam) 
              { 
                  static BOOL afHooks[NUMHOOKS]; 
                  int index; 
                  static HMENU hmenu; 
               
                  switch (uMsg) 
                  { 
                      case WM_CREATE: 
               
                          // Save the menu handle. 
               
                          hmenu = GetMenu(hwndMain); 
               
                          // Initialize structures with hook data. The menu-item 
                          // identifiers are defined as 0 through 6 in the 
                          // header file. They can be used to identify array 
                          // elements both here and during the WM_COMMAND 
                          // message. 
              
                          myhookdata[IDM_CALLWNDPROC].nType = WH_CALLWNDPROC; 
                          myhookdata[IDM_CALLWNDPROC].hkprc = CallWndProc; 
                           
                          // Initialize all flags in the array to FALSE. 
               
                          memset(afHooks, FALSE, sizeof(afHooks)); 
               
                          return 0; 
               
               
                     case WM_COMMAND: 
                          switch (LOWORD(wParam)) 
                          { 
                               // The user selected a hook command from the menu. 
               
                              case IDM_CALLWNDPROC: 
                              
                                  // Use the menu-item identifier as an index 
                                  // into the array of structures with hook data. 
               
                                  index = LOWORD(wParam); 
               
                                  // If the selected type of hook procedure isn't 
                                  // installed yet, install it and check the 
                                  // associated menu item. 
               
                                  if (!afHooks[index]) 
                                  { 
                                      myhookdata[index].hhook = SetWindowsHookEx( 
                                          myhookdata[index].nType, 
                                          myhookdata[index].hkprc, 
                                          (HINSTANCE) NULL, GetCurrentThreadId()); 
                                      CheckMenuItem(hmenu, index, 
                                          MF_BYCOMMAND | MF_CHECKED); 
                                      afHooks[index] = TRUE; 
                                  } 
               
                                  // If the selected type of hook procedure is 
                                  // already installed, remove it and remove the 
                                  // check mark from the associated menu item. 
               
                                  else 
                                  { 
                                      UnhookWindowsHookEx(myhookdata[index].hhook); 
                                      CheckMenuItem(hmenu, index, MF_BYCOMMAND | MF_UNCHECKED); 
                                      afHooks[index] = FALSE; 
                                  } 
               
                              default: 
                                  return (DefWindowProc(hwndMain, uMsg, wParam, lParam)); 
                          } 
                          break; 
                           
                      default: 
                          return DefWindowProc(hwndMain, uMsg, wParam, lParam); 
                  } 
                  return NULL; 
              } 
              
              
              LRESULT WINAPI CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) 
              { 
              	CHAR szCWPBuf[256]; 
              	CHAR szMsg[16]; 
              	HDC hdc; 
              	static int c = 0; 
              	size_t cch;
              	HRESULT hResult; 
              
              	if (nCode < 0)  // do not process message 
              		return CallNextHookEx(myhookdata[CALLWNDPROC].hhook, nCode, 
                                                                  wParam, lParam); 
              
              	// Call an application-defined function that converts a message 
              	// constant to a string and copies it to a buffer. 
              
              	LookUpTheMessage((PMSG) lParam, szMsg); 
              
              	hdc = GetDC(hwndMain); 
              
              	switch (nCode) 
              	{ 
              		case HC_ACTION:
              			hResult = StringCchPrintf(szCWPBuf, 256/sizeof(TCHAR),
                                      "CALLWNDPROC - tsk: %ld, msg: %s, %d times   ",
                                        wParam, szMsg, c++);
              			if (FAILED(hResult))
              			{
              			// TODO: writer error handler
              			}
              			hResult = StringCchLength(szCWPBuf, 256/sizeof(TCHAR), &cch);
              			if (FAILED(hResult))
              			{
              			// TODO: write error handler
              			} 
              			TextOut(hdc, 2, 15, szCWPBuf, cch); 
              			break; 
              
              		default: 
              			break; 
              	} 
              
              	ReleaseDC(hwndMain, hdc); 
              	return CallNextHookEx(myhookdata[CALLWNDPROC].hhook, nCode, 
                                                          wParam, lParam); 
              }

              Wo ich jetzt nicht weiter weiss ist: nichtdeklarierter Bezeichner: 'NUMHOOKS', IDM_CALLWNDPROC, CallWndProc, CALLWNDPROC und hwndMain;
              Weiss jemand wo die deklariert gehören, bzw. als was? Und welche davon müssen in die .h datei?

              Ich weiss es ist eine erschlagende Aufgabe, aber mir gehts ähnlich, da ich in C++noch kaum Erfahrung hab und von der Existenz der win32api erst seit 2 Wochen weiss .

              Ps: ich benutze Visual C++ 2008 Express Edition

              Ich hoffe mir kann geholfen werden(oder bin ich ganz aufm Holzweg?)

              mfG Wolfram

              Comment


              • #8
                Für diese Zeile
                MYHOOKDATA myhookdata[NUMHOOKS];
                ist die Größe von NUMHOOKS nicht bekannt

                Für diese Zeile
                case IDM_CALLWNDPROC
                ist der Wert von IDM_CALLWNDPROC nicht bekannt

                Für die Zeile
                LRESULT WINAPI CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
                könnte die Deklaration in der Header fehlen
                Christian

                Comment


                • #9
                  Für diese Zeile
                  MYHOOKDATA myhookdata[NUMHOOKS];
                  ist die Größe von NUMHOOKS nicht bekannt
                  Und wie krieg ich die Größe raus? (Habs mal als Interger deklariert und auf 1 gesetzt, weil ich nur einen Hook verwende und ich denke, dass das damit zu tun hat, immerhin motzt der Compiler an der Stelle nicht mehr)

                  Für diese Zeile
                  case IDM_CALLWNDPROC
                  ist der Wert von IDM_CALLWNDPROC nicht bekannt
                  hmm... bei mir kommt immer "nichtdeklarierter Bezeichner", als was muss ich den deklarieren?

                  Für die Zeile
                  LRESULT WINAPI CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
                  könnte die Deklaration in der Header fehlen
                  Ist im Header aber deklariert:
                  Code:
                  LRESULT WINAPI CallWndProc( int nCode, WPARAM wParam, LPARAM lParam){}
                  oder muss ich die ausgefüllte Version in den Header stellen?

                  Naja, immerhin hab ich mit deiner Hilfe bis jetzt die Fehler von über 50 auf 30 runter, bzw. überhaupt einen Ansatz, der nach "funtioniert vielleicht" aussieht
                  ->ganz großes DANKE dafür

                  mfG Wolfram

                  Comment


                  • #10
                    Das sieht mir alles nach MS speziellen DLLs aus. Habe bisher nur Standard HOOK DLLs gemacht....
                    Christian

                    Comment


                    • #11
                      Meinst du meine dll oder die Hooks? Wenn es einen anderen Lösungsweg, bzw. eine Lösungsidee, gibt, dann sag ihn mir bitte, ich bin am verzweifeln.

                      mfG Wolfram

                      Comment


                      • #12
                        wohin soll ich das schicken?
                        Christian

                        Comment


                        • #13
                          Originally posted by Christian Marquardt
                          wohin soll ich das schicken?
                          Hast du etwa einen kompletten quellcode?

                          Comment


                          • #14
                            http://www.marquardtnet.info/cecke/p...4/4_index.html

                            Da sind einige Programme dabei, bei denen das genutzt wird

                            http://www.marquardtnet.info/cecke/dlls.3/3_chhook.html
                            wohl nicht für VC....

                            http://www.marquardtnet.info/cecke/t...s.8/8_dll.html
                            Christian

                            Comment


                            • #15
                              Danke für die viele Hilfe, hat mir sehr geholfen.
                              Ich bin jetzt soweit, dass ich meinen Hook (CallWndProc) installieren und entfernen kann, allerdings fehlt mir noch, auf welche Nachrichten ich reagieren muss, da irgendwer ne idee?

                              Ps: bitte keine links zu msdn irgendwas mit hooks, die kenn ich fast auswendig.

                              MfG Wolfram

                              Comment

                              Working...
                              X