删除调试器时,setwindowpos c#方法不起作用

Posted

技术标签:

【中文标题】删除调试器时,setwindowpos c#方法不起作用【英文标题】:setwindowpos c# method not working when debugger is removed 【发布时间】:2017-09-15 09:10:21 【问题描述】:

我已经编写了一个代码,用于在进程启动时将 OSK 键盘定位到屏幕的左下方。我发现当我在句柄处于活动状态时放置调试器时,代码可以正常工作。但是,一旦我删除所有调试点并运行 Windows 窗体,OSK 就不会位于左下角。我发现当删除所有调试点时,句柄 KeyboardWnd 的值为 0。

我也尝试延迟该过程以检查句柄是否加载到那时,但它不起作用。 “等待”也不是一个选项,因为它的调用需要异步

以下是参考代码

 string osk = Path.Combine(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "system32"), "osk.exe");

            //  start the keyboard process
            ProcessStartInfo startInfo = new ProcessStartInfo(osk);                
            Process tmp = Process.Start(startInfo);
            IntPtr KeyboardWnd = GetTabTipWindowHandle();

              System.Threading.Thread.Sleep(20);

            MoveKeyBoard(KeyboardWnd, 0, Screen.PrimaryScreen.Bounds.Height / 4*3);

MoveKeyBoard 依次调用 setwindowpos 方法如下

 public static bool MoveKeyBoard(IntPtr hWnd, int ToX, int ToY)
               
        return SetWindowPos(hWnd, (IntPtr)0, ToX, ToY, Screen.PrimaryScreen.Bounds.Width/2, Screen.PrimaryScreen.Bounds.Height/4, SWP.NOZORDER | SWP.SHOWWINDOW | SWP.NOCOPYBITS);
    

 public static IntPtr GetTabTipWindowHandle()
    
        if (TabTip.UseTabTipKeyboard)
            return FindWindow("IPTip_Main_Window", null);
        else            
            return FindWindow("OSKMainClass", null);

    

【问题讨论】:

GetTabTipWindowHandle() 方法在哪里? 我已经进行了编辑。请看一看。 调试器的优点是它会减慢你的程序。所以 OSK 有足够的时间来创建窗口并且 FindWindow() 可以找到它。您必须等待给它一个初始化的机会。添加 tmp.WaitForInputIdle(). 是最低要求。 试试 FindwindowEx。请参阅 Pinvoke:pinvoke.net/default.aspx/user32.FindWindowEx。使用 c++ 进行以下发布有一个解释:***.com/questions/16530871/… 【参考方案1】:

我得到了解决方案。 下面的代码工作正常

 RegistryKey myKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Osk", true);

                myKey.SetValue("WindowLeft", 0, RegistryValueKind.DWord);
                myKey.SetValue("WindowTop", Screen.PrimaryScreen.Bounds.Height / 4 * 3, RegistryValueKind.DWord);
                myKey.SetValue("WindowWidth", Screen.PrimaryScreen.Bounds.Width / 2, RegistryValueKind.DWord);
                myKey.SetValue("WindowHeight", Screen.PrimaryScreen.Bounds.Height / 4, RegistryValueKind.DWord);
                 IntPtr KeyboardWnd = GetTabTipWindowHandle();


                   MoveKeyBoard(KeyboardWnd, 0, Screen.PrimaryScreen.Bounds.Height / 4 * 3);

【讨论】:

以上是关于删除调试器时,setwindowpos c#方法不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 中的线程删除文件

为啥 SetWindowPos 不改变 ComboBoxEx 下拉高度?

如何判断 C#程序是不是处于调试状态

设置 TabTip 键盘 c# 的位置不起作用

变量在 C# Release x64 中不递增

C# windows 服务在调试时安装,而不是在发布时安装