Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向不在前台的应用程序发送击键(即最小化)_C#_Keypress - Fatal编程技术网

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服务器应用程序。我希望这样做,即使它是最小化的,所以不要弄乱其他已经由程序员在我之前制作的自动化工具。我并没有粘贴大量的代码,它是一行代码,带有备份代码,这样可以避免产生意义较小的问题,并帮助我之后的其他人解决同样的问题。他还不厌其烦地粘贴了对上述平沃克方法的完整解释,以进一步提供帮助。我为我的行为感到抱歉。