none
Macht SetWindowsHookEx Probleme unter Windows 7? RRS feed

  • Frage

  • Hallo zusammen,

    vor einigen Jahren habe ich eine Software mit Visual Studio 6 und C++ entwickelt. Dafür habe ich mir eine Bibliothek programmiert die für mich das Thema Hook abhandelt.
    Jetzt teste ich die Software gerade unter Windows 7. Nun habe ich festgestellt, dass die SetWindowsHook eine NULL zurück gibt. Ich verwende den WH_JOURNALRECORD.

    Weiß jemand ob das unter Windows 7 ein prinzipielles Problem ist? Oder funktioniert das unter Windows 7 anderst oder garnicht mehr?

    Danke für Eure Hilfe !
    Karsten 
    Donnerstag, 17. Dezember 2009 15:32

Antworten

  • UAC deaktivieren:
    http://www.tobbis-blog.de/microsoft/anleitungen/2009-02-11-uac-unter-windows-7-deaktivieren/

    Um die Privilegien zu erhöhen brauchst Du ein Manifest welches so aussieht:
    <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
    <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
          <requestedPrivileges>
            <requestedExecutionLevel level='requireAdministrator' uiAccess='false' />
          </requestedPrivileges>
        </security>
      </trustInfo>
    </assembly>
    Dies muss in einer Textdatei stehen, die genau so heisst wie Deine EXE nur mit ".manifest" angefügt (also z.B. "meine.exemanifest"); und sie muss natürlich im gleichen Verzeichnis wie die EXE liegen.
    Jochen Kalmbach (MVP VC++)
    Dienstag, 22. Dezember 2009 07:11
  • UAC deaktvieren oder Deinen Prozess mit den entsprechenden Rechten starten... (z.B. in VS2008 in den Projekteinstellungen das "requireAdministrator" setzen)...
    Jochen Kalmbach (MVP VC++)
    Freitag, 18. Dezember 2009 16:41

Alle Antworten

  • Was liefert denn "GetLastError()"?
    Jochen Kalmbach (MVP VC++)
    Donnerstag, 17. Dezember 2009 19:36
  • Und ich gehe davon aus, dass Du Deinen eigenen Prozess aufzeichnest, oder?
    Wenn es ein Fremdprozess ist, dann kommt ab Vista natürlich UIPI ins Spiel ;)
    Siehe:
    http://blogs.msdn.com/vishalsi/archive/2006/11/30/what-is-user-interface-privilege-isolation-uipi-on-vista.aspx
    http://msdn.microsoft.com/en-us/library/aa905330.aspx

    Dein Prozess braucht min. die gleichen Privilegien wie der zu hookende Prozess...
    Jochen Kalmbach (MVP VC++)
    Donnerstag, 17. Dezember 2009 19:42
  • Hallo Jochen,
    es ist ein anderer Prozess, d.h. die Tastatur-Befehle auf eine andere Applikation.
    Komischer weise ist es so dass unter Vista alles funktioniert, da habe ich nichts speziell umstellen oder einstellen müssen.

    Grüße
    Karsten
    Freitag, 18. Dezember 2009 15:32
  • Vermutlich war dort UAC deaktiviert...
    Jochen Kalmbach (MVP VC++)
    Freitag, 18. Dezember 2009 15:38
  • Hallo Jochen,

    du hast Recht, es muss an den Berechtigungen liegen GetLastError gibt 5 zurück (ERROR_ACCESS_DENIED).
    Was muss ich tun damit es funktioniert ? Wo muss ich welche Berechtigungen einstellen ?

    Grüße
    Karsten
    Freitag, 18. Dezember 2009 15:44
  • UAC deaktvieren oder Deinen Prozess mit den entsprechenden Rechten starten... (z.B. in VS2008 in den Projekteinstellungen das "requireAdministrator" setzen)...
    Jochen Kalmbach (MVP VC++)
    Freitag, 18. Dezember 2009 16:41
  • Um den Prozess mit den entsprechenden Rechten zu starten, welches Flag muss ich dann noch zusätzlich setzen ?
    (ich verwende noch das VS 6)
    Die Variante um den UAC zu deaktivieren hört sich auch gut an. Welchen Dienst muss ich da beenden ?

    Danke für eure Hilfe

    Grüße
    Karsten
    Montag, 21. Dezember 2009 09:45
  • UAC deaktivieren:
    http://www.tobbis-blog.de/microsoft/anleitungen/2009-02-11-uac-unter-windows-7-deaktivieren/

    Um die Privilegien zu erhöhen brauchst Du ein Manifest welches so aussieht:
    <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
    <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
          <requestedPrivileges>
            <requestedExecutionLevel level='requireAdministrator' uiAccess='false' />
          </requestedPrivileges>
        </security>
      </trustInfo>
    </assembly>
    Dies muss in einer Textdatei stehen, die genau so heisst wie Deine EXE nur mit ".manifest" angefügt (also z.B. "meine.exemanifest"); und sie muss natürlich im gleichen Verzeichnis wie die EXE liegen.
    Jochen Kalmbach (MVP VC++)
    Dienstag, 22. Dezember 2009 07:11
  • Super !
    Besten Dank, jetzt funktioniert alles.

    Viele Grüße
    Karsten
    Dienstag, 22. Dezember 2009 12:01