Win7 alatt nem működő függvény

Win7 alatt nem működő függvény
2011-10-03T13:40:17+02:00
2011-10-07T07:52:12+02:00
2022-11-23T07:00:40+01:00
jkata9
Van egy kis program, ami nálam Win7 alatt nem adja vissza a Form Caption-be a leütött billentyűt, barátom XP-jén viszont igen . Hibaüzenetet nem kapok. Delphi 7-et használok.


unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, XPMan; type TForm1 = class(TForm) XPManifest1: TXPManifest; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Hook:Integer; MessageBuffer:TEventMsg; implementation {$R *.dfm} function Play(Code: integer; wParam, lParam: Longint): Longint; stdcall; begin case Code of HC_ACTION: begin MessageBuffer:=PEventMsg(lParam)^; if MessageBuffer.message=wm_KeyDown then begin Form1.caption:=chr(MessageBuffer.paraml); Result:=0; end; end; else begin Result := CallNextHookEx(Hook, Code, wParam, lParam); end; end; end; procedure TForm1.FormCreate(Sender: TObject); begin Hook:=SetWindowsHookEx(wh_journalrecord,play,HInstance,0); end; procedure TForm1.FormDestroy(Sender: TObject); begin UnHookWindowsHookEx(Hook); end; end.
Mutasd a teljes hozzászólást!
Hmmm....
Itt egy érdekes bejegyzés.
Mintha azt fejtegetné, hogy az admin jog kevés, az UIPI áthágását is engedélyezni kell a manifest-ben. Azaz uiAccess = TRUE, és ami ezzel jár, digitális aláírás.
Mutasd a teljes hozzászólást!

  • A hiba az elkapással van vagy csak a megjelenítéssel?
    Mutasd a teljes hozzászólást!
  • Ugye adminisztrátorként próbálod futtatni?
    Mutasd a teljes hozzászólást!
  • Az elkapással.
    Mutasd a teljes hozzászólást!
  • Igen, adminisztrátorként.
    Mutasd a teljes hozzászólást!
  • Hibaüzenetet nem kapok

    Hol keresed, mert pl. a hook beállításának sikerét
    nem látom, hogy vizsgálnád.


    procedure TForm1.FormCreate(Sender: TObject); begin Hook:=SetWindowsHookEx(wh_journalrecord,play,HInstance,0); if Hook = 0 then ???? end;
    Mutasd a teljes hozzászólást!
  • Igazad van, de nem akartam túlbonyolítani a programot. Ha a Hook = 0, akkor hiba van.
    Mutasd a teljes hozzászólást!
  • Na jó, de vizsgálod ezt az esetet?
    És ha hiba van, mi a hibakód?
    Mutasd a teljes hozzászólást!

  • try Hook:=SetWindowsHookEx(wh_journalrecord,play,HInstance,0); If Hook = 0 then Form1.Caption:='Nem jött létre a Hook.' else Form1.Caption:=IntToStr(Hook); except on e:Exception do begin Form1.Caption:='Hiba: '+E.ClassName+' - '+E.Message; end; end;

    Ezzel próbáltam XP-n, majd Win7 alatt.
    XP alatt simán működik a Hook.
    Win7 alatt az üzenet jön, hogy "Nem jött létre a Hook.".
    Próbáltam a WH_JOURNALRECORD-ot lecserélni WH_KEYBOARD-ra. Ekkor létrejött a Hook, de később futott hibára a progi (a
    MessageBuffer:=PEventMsg(lParam)^;
    - nél).

    Tipp, ötlet?
    Mutasd a teljes hozzászólást!
  • procedure TForm1.FormCreate(Sender: TObject); begin Hook:=SetWindowsHookEx(wh_journalrecord,play,HInstance,0); Win32Check(Hook<>0); end;

    Ha kivételt dob, az üzenetben megkeresni a windows hibakódot,
    és itt megnézni, hogy mit jelent.

    Szerk:
    Önmagában a SetWindowsHook függvényt fölösleges try-except blokkba zárni, Windows API függvények magukban nem váltanak ki Delphi exception-t.
    Mutasd a teljes hozzászólást!
  • Code: 5
    Hozzáférés megtagadva.


    Ezt az üzenetet kaptam. Ami fejtörés, mert tuti hogy rendszergazdaként vagyok a saját gépemben.
    Ötlet?
    Mutasd a teljes hozzászólást!
  • Simán futtattad admin jogú userrel, vagy jobb klikk/futtatás rendszergazdaként? Mert Vista és Win7 alatt alapból akkor se kap admin jogot a processz, ha admin indította, hanem direkt kérni kell az admin jog engedélyezését.
    Mutasd a teljes hozzászólást!
  • "Természetesen" simán futtattam az admin jogommal. Nem klikkeltem a jobb klikkel.
    Mutasd a teljes hozzászólást!
  • Most próbáltam jobb klikk/Futtatás rendszergazdaként, de így sem működött.
    Mutasd a teljes hozzászólást!
  • Win7 tipp:
    Intézőben jobbklikk a progira majd Tulajdonságok -> Kompatibilitás
    Kompatibilitási üzemmód -> Windows XP sp akárhány - pipa be
    Jogosultsági szint -> Rendszergazda - pipa be
    Azt lássuk erre mit lép...
    Mutasd a teljes hozzászólást!
  • Ja és ha van víruskergetőd, annak a kivétel listájára sem ártana felvenni, vagy valahogy jelezni, hogy a progid megteheti a hook beállítást.
    Mutasd a teljes hozzászólást!
  • Vistán volt hasonló problémám, nem engedett egy rakás dolgot hiába rendszergazdaként voltam a rendszerben. A fiókok felügyeletét kell kikapcsolni és akkor nem bírálja felül a rendszer akármit is akarsz csinálni. Nekem még a letöltéseket sem akarta engedélyezni. Felügyelet kikapcs. azóta minden tökéletesen megy. ( 2 órát sz...tam vel mire rájöttem)
    Mutasd a teljes hozzászólást!
  • A program elindult, de a WH_JOURNALRECORD függvény nem dolgozott.
    Mutasd a teljes hozzászólást!
  • Sajnos ezzel is ugyanaz a helyzet: a program elindult, de a függvény nem működött.
    Mutasd a teljes hozzászólást!
  • Magyarán a hook beállításra nem dobott hibát, csak épp semmi látható nem történik?
    Mutasd a teljes hozzászólást!
  • Most szerintem meg kéne szórni a Play funkciót ilyenekkel:


    procedure DebugOutput(str: string); var tm: string; begin tm := FormatDateTime('hh:mm:ss:zzz', Time); OutputDebugString(PChar(Format('%s - %s', [tm, str]))); end; : : function Play(Code: integer; wParam, lParam: Longint): Longint; stdcall; begin DebugOutput('Na ez legalább meghívódott.'); // Meg a macska fel van mászva... case Code of HC_ACTION: begin MessageBuffer:=PEventMsg(lParam)^; if MessageBuffer.message=wm_KeyDown then begin Form1.caption:=chr(MessageBuffer.paraml); Result:=0; end; end; else begin Result := CallNextHookEx(Hook, Code, wParam, lParam); end; end; end;

    A DebugOutput által generált üzeneteket meg egyrészt rögzíti a Delphi, de ez sokkal jobb!
    Mutasd a teljes hozzászólást!
  • Vagy inkább így:

    procedure DebugOutput(str:string); var ModuleName: string; tm: string; begin tm := FormatDateTime('hh:mm:ss:zzz', Time); SetLength(ModuleName, MAX_PATH); SetLength(ModuleName, GetModuleFileName(0, PChar(@ModuleName[1]), MAX_PATH)); ModuleName := AnsiUpperCase(ExtractFileName(ModuleName)); if ModuleName = 'DBGVIEW.EXE' then Exit; // A debugger megfekteti a rendszert, ha saját // magából küldött üzeneteket kell elkapnia. OutputDebugString(PChar(Format('%s - %s: %s', [tm, ModuleName, str]))); end;
    Mutasd a teljes hozzászólást!
  • Úgy nézem Win7 alatt nem futott bele a Play-be. Az XP-s végén több "Na ez legalább..." is volt, de csak 1-et hagytam itt meg.

    Win7 alatti debug eredménye:

    Thread Start: Thread ID: 5064. Process Project2.exe (5948)
    Process Start: D:\Delphi\Win7prog\Project2.exe. Base Address: $00400000. Process Project2.exe (5948)
    Module Load: Project2.exe. Has Debug Info. Base Address: $00400000. Process Project2.exe (5948)
    Module Load: ntdll.dll. No Debug Info. Base Address: $77D50000. Process Project2.exe (5948)
    Module Load: KERNEL32.dll. No Debug Info. Base Address: $77130000. Process Project2.exe (5948)
    Module Load: KERNELBASE.dll. No Debug Info. Base Address: $75FE0000. Process Project2.exe (5948)
    Module Load: USER32.dll. No Debug Info. Base Address: $77540000. Process Project2.exe (5948)
    Module Load: GDI32.dll. No Debug Info. Base Address: $77210000. Process Project2.exe (5948)
    Module Load: LPK.dll. No Debug Info. Base Address: $77260000. Process Project2.exe (5948)
    Module Load: USP10.dll. No Debug Info. Base Address: $77EE0000. Process Project2.exe (5948)
    Module Load: msvcrt.dll. No Debug Info. Base Address: $77AA0000. Process Project2.exe (5948)
    Module Load: ADVAPI32.dll. No Debug Info. Base Address: $77CB0000. Process Project2.exe (5948)
    Module Load: SECHOST.dll. No Debug Info. Base Address: $77C00000. Process Project2.exe (5948)
    Module Load: RPCRT4.dll. No Debug Info. Base Address: $77B50000. Process Project2.exe (5948)
    Module Load: OLEAUT32.dll. No Debug Info. Base Address: $77C20000. Process Project2.exe (5948)
    Module Load: ole32.dll. No Debug Info. Base Address: $77710000. Process Project2.exe (5948)
    Module Load: VERSION.dll. No Debug Info. Base Address: $75350000. Process Project2.exe (5948)
    Module Load: COMCTL32.dll. No Debug Info. Base Address: $72D70000. Process Project2.exe (5948)
    Module Load: IMM32.dll. No Debug Info. Base Address: $77A80000. Process Project2.exe (5948)
    Module Load: MSCTF.dll. No Debug Info. Base Address: $77870000. Process Project2.exe (5948)
    Module Load: UxTheme.dll. No Debug Info. Base Address: $74DA0000. Process Project2.exe (5948)
    Module Load: dwmapi.dll. No Debug Info. Base Address: $74970000. Process Project2.exe (5948)
    Module Load: BtMmHook.dll. No Debug Info. Base Address: $10000000. Process Project2.exe (5948)
    Module Load: SHELL32.dll. No Debug Info. Base Address: $761A0000. Process Project2.exe (5948)
    Module Load: SHLWAPI.dll. No Debug Info. Base Address: $774E0000. Process Project2.exe (5948)
    Module Load: PSAPI.DLL. No Debug Info. Base Address: $774D0000. Process Project2.exe (5948)
    Module Load: COMCTL32.dll. No Debug Info. Base Address: $74DE0000. Process Project2.exe (5948)
    Module Load: CRYPTBASE.dll. No Debug Info. Base Address: $75E20000. Process Project2.exe (5948)


    Ez pedig az XP-s debugé:

    Thread Start: Thread ID: 6252. Process Project2.exe (6908)
    Process Start: C:\Teszt\Win7prog\Project2.exe. Base Address: $00400000. Process Project2.exe (6908)
    Module Load: Project2.exe. Has Debug Info. Base Address: $00400000. Process Project2.exe (6908)
    Module Load: ntdll.dll. No Debug Info. Base Address: $7C900000. Process Project2.exe (6908)
    Module Load: KERNEL32.dll. No Debug Info. Base Address: $7C800000. Process Project2.exe (6908)
    Module Load: USER32.dll. No Debug Info. Base Address: $7E360000. Process Project2.exe (6908)
    Module Load: GDI32.dll. No Debug Info. Base Address: $77F10000. Process Project2.exe (6908)
    Module Load: ADVAPI32.dll. No Debug Info. Base Address: $77DC0000. Process Project2.exe (6908)
    Module Load: RPCRT4.dll. No Debug Info. Base Address: $77E70000. Process Project2.exe (6908)
    Module Load: Secur32.dll. No Debug Info. Base Address: $77FE0000. Process Project2.exe (6908)
    Module Load: OLEAUT32.dll. No Debug Info. Base Address: $77110000. Process Project2.exe (6908)
    Module Load: msvcrt.dll. No Debug Info. Base Address: $77C00000. Process Project2.exe (6908)
    Module Load: ole32.dll. No Debug Info. Base Address: $774D0000. Process Project2.exe (6908)
    Module Load: VERSION.dll. No Debug Info. Base Address: $77BF0000. Process Project2.exe (6908)
    Module Load: COMCTL32.dll. No Debug Info. Base Address: $5D520000. Process Project2.exe (6908)
    Module Load: IMM32.dll. No Debug Info. Base Address: $76360000. Process Project2.exe (6908)
    Module Load: UNKNOWN_MODULE_22. No Debug Info. Base Address: $10000000. Process Project2.exe (6908)
    Module Load: WTSAPI32.dll. No Debug Info. Base Address: $76F40000. Process Project2.exe (6908)
    Module Load: WINSTA.dll. No Debug Info. Base Address: $76330000. Process Project2.exe (6908)
    Module Load: NETAPI32.dll. No Debug Info. Base Address: $5B0E0000. Process Project2.exe (6908)
    Module Load: DBGHELP.dll. No Debug Info. Base Address: $59EB0000. Process Project2.exe (6908)
    Module Unload: UNKNOWN_MODULE_22. Process Project2.exe (6908)
    Module Unload: DBGHELP.dll. Process Project2.exe (6908)
    Module Unload: WTSAPI32.dll. Process Project2.exe (6908)
    Module Unload: WINSTA.dll. Process Project2.exe (6908)
    Module Unload: NETAPI32.dll. Process Project2.exe (6908)
    Module Load: IEBHO.DLL. No Debug Info. Base Address: $10000000. Process Project2.exe (6908)
    Module Load: DBGHELP.dll. No Debug Info. Base Address: $59EB0000. Process Project2.exe (6908)
    Module Unload: IEBHO.DLL. Process Project2.exe (6908)
    Module Unload: DBGHELP.dll. Process Project2.exe (6908)
    Module Load: UxTheme.dll. No Debug Info. Base Address: $5B1D0000. Process Project2.exe (6908)
    Module Load: MSCTF.dll. No Debug Info. Base Address: $746D0000. Process Project2.exe (6908)
    Module Load: msctfime.ime. No Debug Info. Base Address: $75180000. Process Project2.exe (6908)
    ODS: 09:28:24:020 - PROJECT2.EXE: Na ez legalább meghívódott. Process Project2.exe (6908)

    Mutasd a teljes hozzászólást!
  • Idézet a a doksiból:
    hMod [in]

    Type: HINSTANCE

    A handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.
    dwThreadId [in]

    Type: DWORD

    The identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads running in the same desktop as the calling thread.


    Mivel a te hook függvényed a saját processzedben fut, nem DLL-ben, a hMod értéke NULL kell, hogy legyen, a dwThreadId-nek pedig jó az aktuális szál azonosítója. Valahogy így kéne:
    Hook:=SetWindowsHookEx(wh_journalrecord,play,nil,GetCurrentThreadId());
    Legalább is ha jól értelmezem a doksit.
    Mutasd a teljes hozzászólást!
  • Szerintem ez így azt jelentené, hogy a hook-ot csak lokálisan az alkalmazásodra állítod rá,
    viszont szintén a doksi szerint a JournalRecord csak globális lehet.
    Úgyhogy ez sanszosan hibát dob. (1429 - This hook procedure can only be set globally.)


    jkata9:
    Végülis hogy vetted rá, hogy egyáltalán lefusson a program és beállítsa a hook-ot? Mert én a saját javaslataimat követve se tudom rávenni Win7 alatt, hogy ne utasítsa el a beállítást. (:
    Mutasd a teljes hozzászólást!
  • Szerintem nem fog hibát dobni, mivel ezt írja a JournalRecordProc doksija:
    A JournalRecordProc hook procedure does not need to live in a dynamic-link library. A JournalRecordProc hook procedure can live in the application itself.

    Unlike most other global hook procedures, the JournalRecordProc and JournalPlaybackProc hook procedures are always called in the context of the thread that set the hook.


    Vagyis attól, hogy globális, még az alkalmazásod kapja meg, és nem egy DLL.

    De ki kell próbálni, az a biztos
    Mutasd a teljes hozzászólást!
  • Már kipróbáltam :)

    Error code 1429


    Szerk.:
    Az hogy az alkalmazásodra állítod, azt úgy értettem, hogy csak lokálisan a saját progidat monitorozza.
    Mutasd a teljes hozzászólást!
  • Hát pont ez az, hogy Win7 alatt nekem sem állítja be a Hook-ot. XP alatt simán, gond nélkül megy, de a Win7 elutasítja. Mintha a WH_JOURNALRECORD gond lenne neki, mert pl. a WH_KEYBOARD (egy másik progiban, pl. SetWindowsHookEx(WH_KEYBOARD, HookProc, integer(HInstance), 0) ) simán megy.

    Lövésem sincs miért nem megy az eredeti WH_JOURNALRECORD... de még nem adom fel. Köszi az eddigi segítséget is!
    Mutasd a teljes hozzászólást!
  • Hmmm....
    Itt egy érdekes bejegyzés.
    Mintha azt fejtegetné, hogy az admin jog kevés, az UIPI áthágását is engedélyezni kell a manifest-ben. Azaz uiAccess = TRUE, és ami ezzel jár, digitális aláírás.
    Mutasd a teljes hozzászólást!
  • Igen, én is ezt találtam meg. Viszont akkor ezzel lehet hogy választ is kaptunk a kérdésre: a WH_JOURNALRECORD így nem működik Win7 alatt, mint ahogy a fenti kis programban szerepel.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd