c#应用程序中的SetWindowHookEx在运行时失败
本文关键字:运行时 失败 SetWindowHookEx 应用程序 | 更新日期: 2023-09-27 18:09:58
我正在构建一个应用程序使用钩子,我想启动另一个应用程序,在我构建我的应用程序和应用程序将获得另一个应用程序和setwindowhook的自动化窗口句柄后。但是我做不到。请帮帮我。我的英语水平
变量窗口是hwnd当我得到所有的应用程序是windowform正在运行
private bool AddWnd(int hwnd, int lparam)
{
if (IsWindowVisible(hwnd))
{
StringBuilder sb = new StringBuilder(255);
string className = GetClassName((IntPtr)hwnd).ToString();
if (className.Length > 10)
{
string getSubStringClassName = className.Substring(0, 11);
if (getSubStringClassName.Equals("WindowsForm") && IsWindow(hwnd)!=0)
{
GetWindowText(hwnd, sb, sb.Capacity);
window = hwnd;
}
}
}
return true;
}
HookProc HookProcedure;
private const int WH_CBT = 5;
public void startHook()
{
if (hHook == 0)
{
HookProcedure = new HookProc(CbtHookProc);
int threadID = GetWindowThreadProcessId((IntPtr)window, out processHandle);
IntPtr hMod = System.Runtime.InteropServices.Marshal.GetHINSTANCE(typeof(Form1).Module);
hHook = SetWindowsHookEx(WH_CBT, HookProcedure, hMod, threadID);
if (hHook == 0)
{
MessageBox.Show("SetWindowsHookEx Failed");
return;
}
}
else
{
bool ret = UnhookWindowsHookEx(hHook);
//If the UnhookWindowsHookEx function fails.
if (ret == false)
{
MessageBox.Show("UnhookWindowsHookEx Failed");
return;
}
hHook = 0;
button1.Text = "Set Windows Hook";
}
}
可以从托管。net应用程序中安装的钩子只有两种类型:低级键盘(WH_KEYBOARD_LL
)和低级鼠标(WH_MOUSE_LL
)钩子。不同之处在于这两个钩子的回调函数是由您自己的程序实现的。所有其他类型的钩子都需要在DLL中实现回调函数,该DLL实际上可以注入到钩子进程中。这对托管代码不起作用,因为托管dll不能安全地注入到非托管进程中。
所以无论你做什么来修复你的c#代码,这永远不会工作。基于计算机的培训挂钩(WH_CBT
)永远不能从c#应用程序或DLL安装。你需要切换到另一种语言来编写钩子DLL;C和c++是常用的选择。
或者,如果所有你关心的是接收通知时,另一个应用程序创建一个窗口,你可以使用可访问性api代替,从托管应用程序工作。开始研究SetWinEventHook
函数。您需要指定WINEVENT_OUTOFCONTEXT
标志,以确保通知被传递到您的流程;否则需要一个可注入的DLL,我们已经知道这是行不通的。EVENT_OBJECT_CREATE
和/或EVENT_OBJECT_SHOW
事件是您想要监视的事件。