C# 向不在前台的应用程序发送击键(即最小化)
我一直在寻找一个关于如何实现这一点的工作示例,但到目前为止运气不佳 这就是我现在拥有的:C# 向不在前台的应用程序发送击键(即最小化),c#,keypress,C#,Keypress,我一直在寻找一个关于如何实现这一点的工作示例,但到目前为止运气不佳 这就是我现在拥有的: [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); Process[] processlist =
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr
wParam, IntPtr lParam);
Process[] processlist = Process.GetProcesses();
foreach (Process p in processlist)
{
if (p.ProcessName == "notepad")
{
//MessageBox.Show("bu");
/*
LRESULT PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
WM_KEYDOWN
WPARAM wParam
LPARAM lParam;
Parameters
wParam
Specifies the virtual-key code of the nonsystem key.
lParam
Specifies the repeat count, scan code, extended-key flag,
context code, previous key-state flag, and transition-state flag,
as shown in this table.
......So......
LRESULT debugvalue = PostMessage( Handle_to_where_the_message_is_going,
WM_KEYDOWN, (WPARAM)VK_ENTER, (LPARAM)0)
*/
uint WM_KEYDOWN = 0x0100;
PostMessage(p.Handle, WM_KEYDOWN, Marshal.StringToHGlobalAuto("something"), IntPtr.Zero);
}
}
现在,我做错了什么
可能会有帮助很多事情都不对劲。您正在将消息发送到进程。句柄而不是窗口句柄。至少使用Process.MainWindowHandle。此外,您应该发送一个虚拟按键,而不是字符串。Keys枚举可获取密钥代码。发送字符串需要为字符串中的每个字母击键。此外,您还应该发送WM_KEYUP消息。此外,接收应用程序可能会使用键盘状态来确定Shift、Ctrl或Alt键是否为向下键,并相应地将击键转换为键入键。你不能用PostMessage()来伪装
这应该能让它起到一些作用。为了使它真正可靠,我认为您需要一个由SetWindowsHookEx()设置的WH_JOURNALPLAYBACK钩子。你不能用C#写,它不支持将DLL注入另一个进程。看看能为您做些什么。“现在,我做错了什么?”-首先,您可以在其他问题上标出一些答案。。。这可能会让你得到更多的回答,尤其是当你粘贴大量代码而不是问一个有针对性的问题时。你为什么要在一个最小化的应用程序中捕获击键?除非你能证明你所做的是正确的,而且我的假设是错误的,否则我希望版主能给你一个愉快的假期。@Nick,他想给一个最小化的应用程序发送击键,而不是捕获击键。@Mikael-同样的事情,不同的术语,我的观点是…我能想出1000种误用的方式,只有大约5种是有用的,根据用户之前提出的问题,即试图找到用户正在运行的其他软件……根据我提出的其他问题,您完全可以阅读到我正在尝试自动启动和停止Web服务器应用程序。我希望这样做,即使它是最小化的,所以不要弄乱其他已经由程序员在我之前制作的自动化工具。我并没有粘贴大量的代码,它是一行代码,带有备份代码,这样可以避免产生意义较小的问题,并帮助我之后的其他人解决同样的问题。他还不厌其烦地粘贴了对上述平沃克方法的完整解释,以进一步提供帮助。我为我的行为感到抱歉。