这个问题来自:How do you disable system hotkeys in user32.dll?。我没有把它添加到聊天中,因为在谷歌搜索后,这似乎是一个问题,我还没有找到一个有效的解决方案。错误代码似乎有多个原因,其中一个原因可能是损坏的dll。事实是我无法弄清楚是否是这种情况。
此问题的代码来自: https://www.codeproject.com/articles/7294/processing-global-mouse-and-keyboard-hooks-in-c查找文件" HookManager.Callbacks.cs"
有用:https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx
我一直收到以下错误:
错误:System.ComponentModel.Win32Exception(0x80004005):The 无法找到指定的模块 Gma.UserActivityMonitor.HookManager.EnsureSubscribedToGlobalKeyboardEvents() 在[删除的目录] HookManager.Callbacks.cs:第401行
导致此问题的代码:
private static void EnsureSubscribedToGlobalKeyboardEvents()
{
// install Keyboard hook only if it is not installed and must be installed
if (s_KeyboardHookHandle == 0)
{
//See comment of this field. To avoid GC to clean it up.
s_KeyboardDelegate = KeyboardHookProc;
//install hook
s_KeyboardHookHandle = SetWindowsHookEx(
WH_KEYBOARD_LL,
s_KeyboardDelegate,
Marshal.GetHINSTANCE(
Assembly.GetExecutingAssembly().GetModules()[0]),
0);
//If SetWindowsHookEx fails.
if (s_KeyboardHookHandle == 0)
{
//Returns the error code returned by the last unmanaged function called using platform invoke that has the DllImportAttribute.SetLastError flag set.
int errorCode = Marshal.GetLastWin32Error();
//do cleanup
//Initializes and throws a new instance of the Win32Exception class with the specified error.
throw new Win32Exception(errorCode); // this line is causing this
}
}
}
除非我弄错了,否则上述代码的罪魁祸首是:
s_KeyboardHookHandle = SetWindowsHookEx(
WH_KEYBOARD_LL,
s_KeyboardDelegate,
Marshal.GetHINSTANCE(
Assembly.GetExecutingAssembly().GetModules()[0]),
0);
所以有人都明白这里的问题是什么?
我尝试了什么?
我已经尝试过重新创建整个项目并复制+粘贴代码,以防任何程序的其他文件被破坏(从复制到USB或从USB复制)。我相信这个问题已经解决了(虽然我可能会弄错)。问题现在又回来了,我之前认为可行的是不起作用(重新创建项目)。
我会尝试在线找到的其他解决方案,这些解决方案与Windows的问题有关。如果有人能看到代码有什么问题,请告诉我。虽然代码来自一个非常可靠的来源,但加载的人已经使用过它,所以这似乎不太可能。
https://social.msdn.microsoft.com/Forums/en-US/b7d1a35f-3759-4217-91ba-e4416ac19d78/how-do-you-fix-error-code-0x80004005?forum=jscript 我尝试了涉及" regsvr32 jscript.dll"的解决方案。和" regsvr32 vbscript.dll"。它没有用。
答案 0 :(得分:-1)
您交换了SetWindowsHookEx()的最后两个参数:第三个参数应该设置为IntPtr.Zero
用于相同的进程,最后一个参数是线程。
您也可以将线程ID:
括起来[DllImport("kernel32.dll")]
public static extern int GetCurrentThreadId();
SetWindowsHookEx(WH_KEYBOARD_LL, s_KeyboardDelegate, IntPtr.Zero, GetCurrentThreadId());