- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 SetWindowLong 覆盖 winmobile 任务栏的窗口过程(以捕获和阻止按下的按钮)。我创建了一个类,其中一种方法用于覆盖,另一种方法用于恢复窗口过程。 MessageReceived 方法是我用来替换任务栏窗口过程的方法。我的类(class)看起来如下:
class ButtonBlocker
{
public delegate IntPtr WindowProc(IntPtr hwnd, uint uMsg, IntPtr wParam, IntPtr lParam);
public static WindowProc newWindowDeleg;
private static IntPtr oldWindowProc;
[DllImport("coredll.dll")]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("coredll.dll")]
static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("coredll.dll")]
static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("coredll.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
private static IntPtr MessageReceived(IntPtr hwnd, uint uMsg, IntPtr wParam, IntPtr lParam)
{
Debug.WriteLine("Message received");
return CallWindowProc(oldWindowProc, hwnd, uMsg, wParam, lParam);
}
public static void OverrideWindowProc()
{
newWindowDeleg = MessageReceived;
IntPtr taskBarHandle = FindWindow("HHTaskBar", null);
int newWndProc = Marshal.GetFunctionPointerForDelegate(newWindowDeleg).ToInt32();
int result = SetWindowLong(taskBarHandle, -4, newWndProc);
oldWindowProc = (IntPtr)result;
if (result == 0)
{
MessageBox.Show("Failed to SetWindowLong");
}
}
public static void RestoreWindowProc()
{
IntPtr taskBarHandle = FindWindow("HHTaskBar", null);
int result = SetWindowLong(taskBarHandle, -4, oldWindowProc.ToInt32());
}
}
最佳答案
您不能替换由另一个进程拥有的窗口的窗口过程。替换函数的地址只在你的进程中有效。它会在另一个过程中立即引发炸弹。您必须将 DLL 注入(inject)目标进程才能解决此问题。您不能注入(inject)以托管语言编写的 DLL,CLR 未初始化。
关于c# - P/Invoking SetWindowLong 和 CallWindowProc 在托管代码(紧凑框架),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2104667/
为了 Hook wndproc,我编写了一个 wndprochook 并使用 SetWindowLong: wndproc=(WNDPROC)GetWindowLong(hwnd_1,GWL_WNDP
为什么会有CallWindowProc这个函数?我们正在提供窗口过程的地址,所以调用该函数而不是调用另一个调用该函数的函数不是更好吗? 最佳答案 因为 GetWindowLong(或 GetWindo
我正在尝试解决在执行GetLastError()时收到CallWindowProc的错误。代码如下: static LRESULT CALLBACK editSubProc(HWND h, UINT
我需要调用API CallWindowProc((WNDPROC)lpfnOldProc, hWnd, Message, wParam, lParam); 现在如何确保 lpfnOldProc 仍然有
我在使用最新版本的 JNA 库时遇到问题。我曾经通过 User32.INSTANCE.CallWindowProc 调用 CallWindowProc。该过程与此处描述的过程相同:Create a n
我正在尝试使用 SetWindowLong 覆盖 winmobile 任务栏的窗口过程(以捕获和阻止按下的按钮)。我创建了一个类,其中一种方法用于覆盖,另一种方法用于恢复窗口过程。 MessageRe
我是一名优秀的程序员,十分优秀!