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 :-).
Fórum › .NET
Odchytavani WM_PAINT z ciziho procesu.
Lepší je hook, protože subclassing se používá na něco jiného a tudíž to s ním ani nejde. Je to velmi jednoduché, zavolá se SetWindowsHookEx s parametrem WH_CALLWNDPROC. Problém je pouze v tom, že dělat globální hook v .NET nelze, takže si na to nejspíše budeš udělat nativní C++ knihovnu.
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);
}
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žení videa
Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
Uživatelé prohlížející si toto vlákno
Uživatelé on-line: 0 registrovaných, 58 hostů
Podobná vlákna
Require z cizího adresáře — založil Scrash
WIN API WM_PAINT — založil unk
Smazání cizího klíče u tabulky s 60M řádkami — založil CZechBoY
Wireshark - odchytávání paketů — založil ondra
Focus u komponent a odchytávání udalostí — založil Petr
Moderátoři diskuze