使用WPF将Enter键按下到外部应用程序时出现问题

时间:2015-08-18 13:47:13

标签: c# wpf windows winapi

我正在尝试使用以下代码向外部应用程序发送Enter键。我已经在WPF中对这个主题做了很多研究,但还没有让它发挥作用。谁能明白为什么这可能不起作用?

    [DllImport("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);

    const int WM_KEYDOWN = 0x0100;
    const int WM_KEYUP = 0x0101;
    const int VK_ENTER = 0x0D;

    SendMessage((IntPtr)myProcess.MainWindowHandle, WM_KEYDOWN, (IntPtr)VK_ENTER, IntPtr.Zero);
    SendMessage((IntPtr)myProcess.MainWindowHandle, WM_KEYUP, (IntPtr)VK_ENTER, IntPtr.Zero);

注意:

- 我没有任何访问外部应用程序代码的权限,因为它不是我的。

-SendKeys不适用于WPF。

2 个答案:

答案 0 :(得分:2)

您是否尝试过Win32应用程序或WPF以外的其他应用程序?您需要了解外部应用程序本身才能尝试与之交谈。您正在向窗口发送一条输入消息,但是有什么东西专注于外部应用程序,是否需要激活它来处理事件,外部应用程序是否故意阻止/过滤外部命令?有很多事情可能会发生。

你可以做的一件事就是看看发送消息是否真的有效,就是调试两个应用程序。尝试将消息发送到另一个基本应用程序,当它获得一个输入按下命令时会触及一个断点。如果这样可行,那么您就知道您对主题中的外部应用程序的理解正在做您不期望的事情。

关于.wrapper{ width: 100%; height: 100%; position: relative; display:flex; flex-direction:column; border:1px solid red;} #header { margin-left: -25px; margin-top: -25px; margin-bottom: 0px; width: 100%;} <div class="wrapper"> <div id="header"> <nav> <ul> <li><a href="#"></a></li> <li><a href="#"></a> <ul> <li><a href="#" class="scroll"></a></li> </ul> </li> <li><a href="#"></a> <ul> <li><a href="#"></a></li> <li><a href="#" class="scroll"></a></li> </ul> </li> <li><a href="#"></a> <ul> <li><a href="#" class="scroll"></a></li> <li><a href="#"></a> <ul> <li><a href="#">Film</a></li> <li><a href="#">Foto</a></li> <li><a href="#">Design</a></li> </ul> </ul> </li> </ul> </nav> </div> <div id="project"> <h2>Project</h2></a> </div> <footer> <div class="footlist"> <li> <div class="ikon"> <a href="facebook"><img src="fb.png" alt="facebook" height="40" width="40"></a> <a href="twitter"><img src="twi.png" alt="twitter" height="40" width="40"></a> <a href="facebook"><img src="insta.png" alt="instagram" height="40" width="40"> </div> </li> </div> </footer> </div> 的另一个有用的事情是它返回SendMessage。发送邮件后的返回值是多少?您可能已经阅读过,但请确保您对SendMessage有所了解,尤其是:

  

邮件发送受UIPI约束。进程的线程只能将消息发送到完整性级别较低或相等的进程中的线程的消息队列。

以及整个备注部分。我认为它也值得理解编组WM_USERWM_APPRegisterWindowMessage

如果不是0,请告诉我们您的返回值。

修改

我用Google搜索了您的问题并导航到this,但标记为int。您应该可以尝试相同的PostMessagePostThreadMessage来电,因为它也在delphi。最后一个和第二个帖子here似乎警告OP记得在您发送user32.dll时随时致电KeyUp。请记住检查返回值。

答案 1 :(得分:0)

检查您的SendMessage电话。 msdn文档中声明的第一个参数:

hWnd [in]
Type: HWND
A handle to the window whose window procedure will receive the message
...

是目标应用程序窗口。因此,使用您的代码,您将向窗口发送消息。

另一方面,在wpf应用程序中,“消息循环”的行为与传统的Windows应用程序略有不同。

我可以建议2种方法

  1. 下载InputSimulator(这是一个dll)并尝试使用它。
  2. 下载InputSimulator(这是一个dll)。将新的控制台应用程序项目添加到您的解决方案中,使用其中的InputSimulator发送消息并将其作为流程实例从您的wpf应用程序中调用。