none
窗口接收不到ENTER ESC这两个键的输入,请大家帮忙,谢谢!! RRS feed

  • 问题

  • 程序说明:

          将窗口封装到DLL中,然后在主程序中通过新建的AppDomain来加载这个Dll,在程序运行时打开该窗口,发现该窗口通过KeyDown事件捕获不到ENTER ESC两个键,但其它的输入都能捕获到。不知道是什么原因,还请给位高手指点一下。

          应该和焦点没有关系吧,因为其它的键盘输入都可以,唯独ENTER ESC捕获不到,另外按TAB键程序会死掉。

    2013年5月24日 8:24

答案

全部回复

  • 回车会造成对话框上的默认按钮的点击事件被触发。ESC会造成窗口被取消。

    Tab键程序不应该死掉啊?你有代码造成死循环了?



    Visual C++ MVP

    2013年5月24日 17:02
    版主
  • 应该不是这个原因,因为是窗口也没有接收到ENTER ESC按键。示例代码说明:通过AppDomain动态远程加载插件后,插件中的窗口接收不到ENTER ESC两个按键(在窗口的KeyDown事件中捕获不到这两个键(窗口的KeyPreview已设置为Ture),其它的都可以。)主程序: //创建AppDomain,并加载自定义插件(插件中有窗口,窗口中的控件接收不到ENTER ESC按键); public void CreateAppDomain() { AppDomain.CurrentDomain.SetupInformation.ShadowCopyFiles = "true"; AppDomainSetup setup = new AppDomainSetup(); setup.ApplicationBase =AppDomain.CurrentDomain.SetupInformation.ApplicationBase; setup.ApplicationName = "Test"; setup.ShadowCopyDirectories = setup.ApplicationBase; setup.ShadowCopyFiles = "true"; setup.CachePath = Path.Combine(setup.ApplicationBase, "Test"); setup.PrivateBinPath = Path.Combine(setup.ApplicationBase, "Test"); _pluginAppdomain = AppDomain.CreateDomain("Test", null, setup); PluginRemoteLoader = (RemoteLoader)_pluginAppdomain.CreateInstanceFromAndUnwrap(Path.GetFileName(Application.ExecutablePath), typeof(RemoteLoader).FullName); } private void button3_Click(object sender, EventArgs e) { if (PluginRemoteLoader != null) { if (PluginRemoteLoader.PluginInstance == null) { PluginRemoteLoader.LoadPluginAssemblyAndCreateInstance(@"D:\00 VisualStudio\Projects\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\ClassLibrary1.dll", "ClassLibrary1.Class1"); } PluginRemoteLoader.InvokeMethod("ShowWinForm", null); } } class RemoteLoader : MarshalByRefObject { public bool LoadPluginAssemblyAndCreateInstance(string pluginAssemblyFile, string pluginFullName) { bool loadSuccess = false; try { PluginAssembly = Assembly.LoadFrom(pluginAssemblyFile); Type[] pluginTypes = PluginAssembly.GetTypes(); foreach (Type pluginType in pluginTypes) { if (pluginType.FullName == pluginFullName) { PluginType = pluginType; PluginInstance = PluginAssembly.CreateInstance(pluginType.FullName); loadSuccess = true; break; } } } catch (Exception ex) { return false; } return loadSuccess; } public object InvokeMethod(string methodName, object[] args) { MethodInfo methodInfo = PluginType.GetMethod(methodName); return methodInfo.Invoke(PluginInstance, args); } }
    2013年5月25日 0:42
  • 检查下dll窗体是不是设置了默认的接收和撤销键。设置了这两个键 enter和esc就捕获不到的。tab死掉应该是代码的问题了。


    • 已编辑 FoolRabbit 2013年5月27日 23:46 补充
    2013年5月27日 23:43
  • 应该不是这样的。

    我实验了一下,如果在Dll中使用非模式方式打开frmTest.Show();来打开则接收不到Enter和Esc,但是如果使用模式窗口方式打开frmTest.ShowDialog();则正常。

    2013年5月28日 1:51
  • 应该是消息循坏没有转发对话框消息的问题,你可以用消息钩子抓这两个键,参考http://support.microsoft.com/kb/233263


    Visual C++ MVP

    2013年5月28日 15:05
    版主