删除调试器时,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#方法不起作用的主要内容,如果未能解决你的问题,请参考以下文章