Globální hook – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Globální hook – C / C++ – Fórum – Programujte.comGlobální hook – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Tepster0
Duch
16. 12. 2014   #1
-
0
-

Zdravím,

potřebuji odchytit událost ve WndProc jakéhokoli okna. Podle různých návodů jsem si vytvořil DLL v C++ a ten zbytek dělám v C#. Problém mám v té knihovně.

 Samotný hook vytvářím takto:

HookCallWndProc = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)CallWndProcHookCallback, DllInstance, GetWindowThreadProcessId(handleofTarget, NULL));

A k tomu mám funkci:

LRESULT CALLBACK CallWndProcHookCallback(int code, WPARAM wparam, LPARAM lparam)
{
	if (code >= 0)
	{
		UINT msg = RegisterWindowMessage(L"HOOK_CALLWNDPROC");
		SendNotifyMessage(HandleofApp, msg, wparam, lparam);
	}

	return CallNextHookEx(HookCallWndProc, code, wparam, lparam);
}

Která vytváří zprávu "HOOK_CALLWNDPROC", kterou odchytím v C# (to mi funguje). Nicméně nevím, kde teď mám vzít tu konkrétní zprávu? Myslím jako jestli je to WM_CREATE, WM_DESTROY, WM_MOVE... Předpokládal bych, že to bude v té proměnné "code", ale ono není.

Děkuji

Nahlásit jako SPAM
IP: 188.175.191.–
Reklama
Reklama
Grungy0
Super člen
16. 12. 2014   #2
-
0
-
Nahlásit jako SPAM
IP: 188.167.57.–
Prvý náznak hlúposti, je pocit geniality.
Tepster0
Duch
16. 12. 2014   #3
-
0
-

Děkuji! Už jsem nečekal, že mi někdo odpoví :)

Abych pravdu řekl, jsem v C++ docela začátečník. Jak mám získat konkrétně tu zprávu? Pokud je lparam pointer, tak k hodnotě, na kterou odkazuje přistoupím pomocí *lparam, tudíž k té zprávě bych měl přistoupit pomocí *lparam.message. To ale není správně, že? Píše to "left of '.message' must have class/struct/union".

Nahlásit jako SPAM
IP: 88.102.19.–
Grungy0
Super člen
16. 12. 2014   #4
-
0
-

Musíš to pretypovať.

((PCWPRETSTRUCT)lparam)->message

V cčku som už dlhšie nerobil a nemám to kde vyskúšať, ale v zásade to pretypuješ na pointer na štruktúru a pristúpiš k položke message.

Nahlásit jako SPAM
IP: 188.167.57.–
Prvý náznak hlúposti, je pocit geniality.
Tepster0
Duch
18. 12. 2014   #5
-
0
-

Děkuji. Poslal jsem do C# celou proměnnou lparam a až tam převádím na strukturu. Ta komunikace mezi C++ a C# mi tedy funguje dobře a odchytávám zprávy.

Mám tu ale ještě jeden, a docela zásadní, problém - nefunguje mi to globálně. Podle tohoto článku/dokumentace jsem zjisil, že když chci, aby byl hook globální, tak mám poslední parametr funkce SetWindowsHookEx()nastavit jako NULL. Nicméně stejně dostávám jen zprávy pro mé okno a ne pro ostatní.

V DLL vytvářím hook takto:

HookCallWndProc = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)CallWndProcHookCallback, DllInstance, NULL);

A funkce CallWndProcHookCallback vypadá takto:

LRESULT CALLBACK CallWndProcHookCallback(int code, WPARAM wparam, LPARAM lparam)
{
	if (code >= 0)
	{
		UINT msg = RegisterWindowMessage(L"HOOK_CALLWNDPROC");
		SendNotifyMessage(HandleofApp, msg, wparam, lparam);
	}

	return CallNextHookEx(HookCallWndProc, code, wparam, lparam);
}

V C# projektu jsem nastavil Build na x86. A mám to takto:

[DllImport("user32.dll")]
static extern int RegisterWindowMessage(string lpString);

[DllImport(@"C:\Users\Tepster\Desktop\SimpleDLL\Debug\SimpleDLL.dll")]
static extern bool InstallCallWndProcHook(IntPtr handleofApp);

private void btnInstall_Click(object sender, EventArgs e)
{
    _MsgID_CallWndProc_Install = RegisterWindowMessage("HOOK_INSTALL");
    _MsgID_CallWndProc = RegisterWindowMessage("HOOK_CALLWNDPROC");

    InstallCallWndProcHook(this.Handle);
}

[StructLayout(LayoutKind.Sequential)]
public struct CWPSTRUCT
{
    public IntPtr lparam;
    public IntPtr wparam;
    public int message;
    public IntPtr hwnd;
}

protected override void WndProc(ref Message m)
{
    ...

    CWPSTRUCT cwps = (CWPSTRUCT)Marshal.PtrToStructure(m.LParam, typeof(CWPSTRUCT));
    int message = cwps.message;
            
    ...
}

Nevíte někdo, proč mi to nefunguje?

Děkuji

Nahlásit jako SPAM
IP: 188.175.191.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 195 hostů

Podobná vlákna

DirectPlay hook — založil Farrell

C# hook API. — založil LukAss741

Globální proměnné — založil 3xore

Globální proměnné — založil Martin

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý