使用ShellExecuteEx()启动osk.exe之后,我想相对于数据输入字段放置键盘窗口,以使其不覆盖它们。
调用前如何设置osk的窗口位置?
另外,完成后如何让应用程序隐藏osk?
您可以使用窗口类“ OSKMainClass”使用FindWindow来获取窗口句柄,然后在该句柄上使用SetWindowPos将其定位到所需的坐标。(您可能需要使用控件的ClientToScreen方法转换为适当的坐标,但我会让您弄清楚该部分。)
// Off the top of my head - not at a machine that has a Delphi compiler at
// the moment.
var
OSKWnd: HWnd;
begin
OSKWnd := FindWindow(PChar('OSKMainClass'), nil);
if OSKWnd <> 0 then
begin
SetWindowPos(OSKWnd,
HWND_BOTTOM,
NewPos.Left,
NewPos.Top,
NewPos.Width,
NewPos.Height,
0);
end;
end;
摘自与同一主题相关的CodeProject文章的部分代码。我使用AutoHotKey的Window Spy实用程序获取了窗口类。
笔记:
雷米·勒博(Remy Lebeau)在评论中指出,您应该确保使用CreateProcess()
或,ShellExecuteEx()
以便您可以取回可WaitForInputIdle()
在调用之前传递给它的进程句柄FindWindow()
。否则,FindWindow()
可能在OSK创建窗口之前发生对的调用。
mghie在评论中指出,他唯一可以使它起作用的方法就是以管理员身份运行该应用程序。否则,对的调用SetWindowPos()
导致“访问被拒绝(5)”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句