Odchytavani WM_PAINT z ciziho procesu. – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Odchytavani WM_PAINT z ciziho procesu. – .NET – Fórum – Programujte.comOdchytavani WM_PAINT z ciziho procesu. – .NET – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Michal
~ Anonymní uživatel
624 příspěvků
12. 9. 2013   #1
-
0
-

Dobry vecer,

chtel bych vytvorit aplikaci, ktera by dokazala reagovat, kdyz se cizi aplikace (napr. chorme... atd) prekresli resp. dojde v zmene v oknu. Potrebuju si ujasnit par veci. Pouzit nejaky globalni hook? ci subclassing? a jak? Co je nejlepsi?

Asi budu muset napsat nejakou DLL knihovnu v C++, ktera se pak vlozi do ciziho procesu...

Potreboval bych nakopnout, jakou cestou se mam vydat :-).

Nahlásit jako SPAM
IP: 188.175.163.–
Reklama
Reklama
liborb
~ Redaktor
+18
Guru
13. 9. 2013   #2
-
+1
-
Zajímavé
Nahlásit jako SPAM
IP: 188.75.135.–
Michal
~ Anonymní uživatel
624 příspěvků
13. 9. 2013   #3
-
0
-

Vytvoril jsme si knihovnu, kdyz hooknu sve okno nebo vsechny procesy tak to funguje, avsak kdyz se snazim hookovat konkterni proces(vlakno) nechodi mi zpravy HOOK_CALLWNDPROC do meho programu.

Jeste uvedu, ze hookuji pouze 32-bit procesy jelikoz mam 32-bit knihovnu, takze tam problem neni.

DLL Knihovna:

HINSTANCE DllInstance = NULL;
HHOOK HookCallWndProc = NULL;
HWND HandleofApp = NULL;

static LRESULT CALLBACK CallWndProcHookCallback(int code, WPARAM wparam, LPARAM lparam);

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:

			if (DllInstance == NULL)
				DllInstance = hModule;

			break;
		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
			break;
	}
	return TRUE;
}

static 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);
}

bool WINAPI InstallCallWndProcHook(HWND handleofTarget, HWND handleofApp)
{
	HandleofApp = handleofApp;

	UINT msg = RegisterWindowMessage(L"HOOK_INSTALL");
	SendNotifyMessage(HandleofApp, msg, 0, 0);	
	
	HookCallWndProc = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)CallWndProcHookCallback, DllInstance, GetWindowThreadProcessId(handleofTarget, NULL));

	if(HookCallWndProc == NULL)
	{
		return false;
	}else{
		return true;
	}
}

void UninstallCallWndProcHook()
{
	if (HookCallWndProc!= NULL)
		UnhookWindowsHookEx(HookCallWndProc);

	HookCallWndProc = NULL;
}

Program:

 

  [DllImport("Hook.dll")]
		private static extern bool InstallCallWndProcHook(IntPtr handleofTarget, IntPtr handleofApp);

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

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        private int _MsgID_CallWndProc;
        private int _MsgID_CallWndProc_Install;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            _MsgID_CallWndProc_Install = RegisterWindowMessage("HOOK_INSTALL");
            _MsgID_CallWndProc = RegisterWindowMessage("HOOK_CALLWNDPROC");
    
            IntPtr h = FindWindow(null, "Muj_Form12345");
            InstallCallWndProcHook(h, this.Handle);
        }

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == _MsgID_CallWndProc_Install)
            {
            }
            else if (m.Msg == _MsgID_CallWndProc)
            {

            }
            
            base.WndProc(ref m);
        }
Nahlásit jako SPAM
IP: 188.175.163.–
Michal
~ Anonymní uživatel
624 příspěvků
17. 9. 2013   #4
-
0
-

Takze nakonec jsem si nato prisel sam :-)... Handle(HandleofApp) aplikace musi byt ve sdilenem datovem segmentu, aby pak dllko mohlo zpravy posilat do aplikace.

Nahlásit jako SPAM
IP: 37.188.239.–
Martin Kozibrátka0
Stálý člen
17. 9. 2013   #5
-
0
-

#4 Michal
No vidíš, jaký si borec

Nahlásit jako SPAM
IP: 88.83.169.–
Savana.cz - neomezený webhosting za pár kaček :)
Michal
~ Anonymní uživatel
624 příspěvků
17. 9. 2013   #6
-
0
-

Dekuji za uznani ;-)...

Nahlásit jako SPAM
IP: 188.175.163.–
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, 33 hostů

 

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