在C#使用PostMessage模拟键盘消息会出现一直发送键盘消息到程序未响应的情况 50
[DllImport("user32.dll",EntryPoint="PostMessage")]staticexternboolPostMessage(IntPtrh...
[DllImport("user32.dll", EntryPoint = "PostMessage")]
static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wParam, string lParam);
[DllImport("user32.dll", EntryPoint = "FindWindowA")]
public static extern IntPtr FindWindowA(string lp1, string lp2);
[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
public static extern IntPtr FindWindowEx(IntPtr hWnd1, IntPtr hWnd2, string lpsz1, string lpsz2);
[DllImport("user32.dll", EntryPoint = "keybd_event")]
public static extern IntPtr keybd_event(IntPtr hWnd1, IntPtr hWnd2, string lpsz1, string lpsz2);
private void button1_Click(object sender, EventArgs e)
{
const int WM_KEYDOWN = 0x0100;
const int WM_KEYUP = 0x0101;
const int WM_CHAR = 0x0102;
const int WM_SETTEXT = 0x000C;
IntPtr VK_A = new IntPtr(65);
IntPtr hwnd = FindWindowA(null, "无标题 - 记事本");
IntPtr htextbox = FindWindowEx(hwnd, IntPtr.Zero, "EDIT", null);
PostMessage(htextbox, WM_CHAR, VK_A, "0");
}
或者求一段可以向其他进程发送键盘消息和文本消息的代码,最好有注释,万分感谢 展开
static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wParam, string lParam);
[DllImport("user32.dll", EntryPoint = "FindWindowA")]
public static extern IntPtr FindWindowA(string lp1, string lp2);
[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
public static extern IntPtr FindWindowEx(IntPtr hWnd1, IntPtr hWnd2, string lpsz1, string lpsz2);
[DllImport("user32.dll", EntryPoint = "keybd_event")]
public static extern IntPtr keybd_event(IntPtr hWnd1, IntPtr hWnd2, string lpsz1, string lpsz2);
private void button1_Click(object sender, EventArgs e)
{
const int WM_KEYDOWN = 0x0100;
const int WM_KEYUP = 0x0101;
const int WM_CHAR = 0x0102;
const int WM_SETTEXT = 0x000C;
IntPtr VK_A = new IntPtr(65);
IntPtr hwnd = FindWindowA(null, "无标题 - 记事本");
IntPtr htextbox = FindWindowEx(hwnd, IntPtr.Zero, "EDIT", null);
PostMessage(htextbox, WM_CHAR, VK_A, "0");
}
或者求一段可以向其他进程发送键盘消息和文本消息的代码,最好有注释,万分感谢 展开
展开全部
想要往其他的进程的消息循环里发送消息的话,首先要Attach到另外一个进程的当前执行线程上,才可以PostMessage,以下是我的测试代码,希望对你有所帮助
已知另一个进程的窗体句柄和子控件句柄
[DllImport("User32.dll", SetLastError = true)]private static extern int GetWindowThreadProcessId(IntPtr hWnd, IntPtr lpdwProcessId);
[DllImport("User32.dll", SetLastError = true)]private static extern bool AttachThreadInput(int idAttach, int idAttachTo, bool fAttach);
[DllImport("User32.dll", SetLastError = true)]private static extern IntPtr SetActiveWindow(IntPtr hWnd);
[DllImport("User32.dll", SetLastError = true)]private static extern IntPtr SetFocus(IntPtr hWnd);
[DllImport("User32.dll", SetLastError = true)]
private static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wParam, string lParam);
IntPtr nHandler; //子控件句柄
IntPtr nWindowHandler; //窗体句柄
//Attach到另外一个进程的执行线程上
if (AttachThreadInput(AppDomain.GetCurrentThreadId()//当前程序的线程ID, GetWindowThreadProcessId(nWindowHandler, (IntPtr)null), true)//目标线程的ID)
{
SetActiveWindow(nWindowHandler);//先激活目标窗体
SetFocus(nHandler);//给目标窗体的子控件设置焦点
IntPtr VK_A = new IntPtr(65);//这是你的代码,我直接拿过来用了
PostMessage(nHandler, 0x0102, VK_A, null);
AttachThreadInput(AppDomain.GetCurrentThreadId(), GetWindowThreadProcessId(nWindowHandler, (IntPtr)null), false);//最后把线程Detach掉
}
搞定
已知另一个进程的窗体句柄和子控件句柄
[DllImport("User32.dll", SetLastError = true)]private static extern int GetWindowThreadProcessId(IntPtr hWnd, IntPtr lpdwProcessId);
[DllImport("User32.dll", SetLastError = true)]private static extern bool AttachThreadInput(int idAttach, int idAttachTo, bool fAttach);
[DllImport("User32.dll", SetLastError = true)]private static extern IntPtr SetActiveWindow(IntPtr hWnd);
[DllImport("User32.dll", SetLastError = true)]private static extern IntPtr SetFocus(IntPtr hWnd);
[DllImport("User32.dll", SetLastError = true)]
private static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wParam, string lParam);
IntPtr nHandler; //子控件句柄
IntPtr nWindowHandler; //窗体句柄
//Attach到另外一个进程的执行线程上
if (AttachThreadInput(AppDomain.GetCurrentThreadId()//当前程序的线程ID, GetWindowThreadProcessId(nWindowHandler, (IntPtr)null), true)//目标线程的ID)
{
SetActiveWindow(nWindowHandler);//先激活目标窗体
SetFocus(nHandler);//给目标窗体的子控件设置焦点
IntPtr VK_A = new IntPtr(65);//这是你的代码,我直接拿过来用了
PostMessage(nHandler, 0x0102, VK_A, null);
AttachThreadInput(AppDomain.GetCurrentThreadId(), GetWindowThreadProcessId(nWindowHandler, (IntPtr)null), false);//最后把线程Detach掉
}
搞定
更多追问追答
追问
我是想做一个可以同时发消息到后台程序的代码,如果激活的话就偏离初衷了
追答
哦,那就把这两句删掉
SetActiveWindow(nWindowHandler);//先激活目标窗体
SetFocus(nHandler);//给目标窗体的子控件设置焦点
一样,我只是觉得那样的效果更好一些
你的问题在于,你PostMessage是给自己进程的消息循环发送消息,不起作用的,必须要Attach到另外一个进程的消息循环上才可以,问题就出在这里了,呵呵,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
VS的项目配置有问题,把Debug中的实时调试选项给关掉。
追问
试过了,不好使
追答
你如果是单步调试时出现卡住的情况很正常,这个不是程序的原因,确实是IDE造成的,不必花太多心思纠结。
如果是你说的未响应,那就是程序的原因了。你可以单步调试点,看看代码到哪里停下来,或者未按你的程序逻辑走,这样就可以找到出错点了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我有一个,只能给一般的程序发送键盘消息,但是对游戏无效,如果你想做外挂的话,别想了
更多追问追答
追问
不是游戏外挂,给PPT发键盘消息
追答
可以的,我晚上给你找找,代码在家呢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询