/// <summary>
/// 启动钩子
/// </summary>
private void Window_Loaded(object sender, RoutedEventArgs e)
{
try
{
SystemThreadingThreadSleep(300);//300ms之后启动系统钩子接收数据
IntPtr hwnd = new WindowInteropHelper(this)Handle;
HwndSourceFromHwnd(hwnd)AddHook(new HwndSourceHook(WndProc));
}
catch { }
}
#region 接收数据
/// <summary>
/// 委托WndProc方法
/// 接收服务端的消息
/// <para hwnd=IntPtr></para>
/// <para msg=int></para>
/// <para wParam=IntPtr></para>
/// <para lParam=IntPtr></para>
/// <para handled=bool></para>
/// </summary>
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
//添加你的代码
return IntPtrZero;
}
原理大概就是这样的,你做个测试试试,很快就上手了!
// 你是用线程钩子函数就行
// 第一个尝试是处理的消息类型
//第二个是回调函数
//第三个为NULL就行
//第四个参数是处理那个线程的消息 (这里是本线程)
HHOOK g_keyhook=NULL;
g_keyhook=SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL,GetCurrentThreadId());
//////////////////////////////////////////////////////
//键盘钩子(回调函数)
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
//如何处理键盘消息
//如果钩子处理的消息,您可以返回一个非0值,防止系统把消息传递给钩子链中的下一个钩
//子, //或者把消息发送到目标窗口。
return CallNextHookEx(g_keyhook, code, wParam, lParam);
};
在hook环境下运行的原理及解决方法如下:
原理:Hook是Windows中提供的一种用以替换DOS下“中断”的系统机制,中文译为“挂钩”或“钩子”。在对特定的系统事件进行hook后,一旦发生已hook事件,对该事件进行hook的程序就会收到系统的通知,这时程序就能在第一时间对该事件做出响应。
解决方法:直接搜索apk isGooglePlayServicesAvailable这个函数,使其返回结果为O即可,然而此时手机若没有谷歌框架,apk可以正常运行。
window系统的程序都是消息驱动机制,意思就是说靠消息来响应事件,当我们点击commandbutton时 系统会获取这个消息,然后会把这个 鼠标 或者键盘按键消息发送给 commandbutton 处理消息的一个函数,他人称之为 窗口过程,系统吧消息发送给 该 commandbutton 的窗口过程,该窗口过程 就会按消息 不同种类执行相应的代码,如下代码 是拦截 鼠标和键盘的按键消息,从而 不让窗口过程 调用 click 方法。
’-------------------------------------窗口代码
Private Sub Command1_Click()
MsgBox 1
End Sub
Private Sub Form_Load()
OldPrc = SetWindowLong(Command1hwnd, -4, AddressOf CommandProc)
End Sub
‘-------------------------------------模块代码
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public OldPrc As Long
Public Function CommandProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
DebugPrint Hex(Msg)
If Msg = &H201 Or Msg = &H100 Then Exit Function
CommandProc = CallWindowProc(OldPrc, hwnd, Msg, wParam, lParam)
End Function
'特别说明下,执行 Click 方法的时候是Form窗口的窗口过程调用Click方法,并非是 Command 按钮的窗口过程,系统首先是把消息 发送给 Command 按钮的窗口过程,然后Command 按钮的窗口过程 又把消息 转发给 Form窗口的窗口过程,然后 Form窗口的窗口过程 按消息种类 执行
我们写的 Command的一些方法,
详细内容请参考 MSDN 或者 windows核心编程 的windows消息机制
/鼠标钩子过程,目的是加载本dll到使用鼠标的程序
//鼠标钩子的作用:当鼠标在某程序窗口中时,其就会加载我们这个dll
LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{
if (nCode==HC_ACTION)
{
//将钩子所在窗口句柄发给主程序
::SendMessage(g_hWnd,UM_WNDTITLE,wParam,(LPARAM)(((PMOUSEHOOKSTRUCT)lParam)->hwnd));
}
return CallNextHookEx(hhk,nCode,wParam,lParam);
}
//安装钩子
BOOL WINAPI StartHook(HWND hWnd)
{
g_hWnd=hWnd;
hhk=::SetWindowsHookEx(WH_MOUSE,MouseProc,hInst,0);
if (hhk==NULL)
{
return FALSE;
}
else
{
return TRUE;
}
}
//卸载钩子
VOID WINAPI StopHook()
{
HookOff();//记得恢复原API入口哈
//主程序调用该函数时,恢复的只是主程序原API的入口,
//其它程序的API入口还没有被恢复,所以我们必须处理
//dll退出过程,即在函数ExitInstance()中,调用恢复
//API入口的函数HookOff(),只有这样,其它程序再次调用
//原API时,才不会发生错误喔。
//当我们HOOK所有程序的某个系统API时,千万要注意在
//ExitInstance()中调用HookOff(),血的教训哈。
if (hhk!=NULL)
{
UnhookWindowsHookEx(hhk);
FreeLibrary(hInst);
}
}
以上就是关于关于C# Hook,求一个小程序全部的内容,包括:关于C# Hook,求一个小程序、C++ hook如何只屏蔽某个程序的键盘输入,而不是所有程序.、软件在hook环境下运行是怎么回事等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)