Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何以编程方式移动Windows任务栏?_C++_Windows_Winapi - Fatal编程技术网

C++ 如何以编程方式移动Windows任务栏?

C++ 如何以编程方式移动Windows任务栏?,c++,windows,winapi,C++,Windows,Winapi,我想知道将Windows任务栏移动(或调整大小)到另一个位置(包括另一个显示器(如果是双显示器))的任何API或解决方法(例如脚本或注册表)。当然,我们可以用鼠标移动任务栏,但我想用程序或某种自动化的方式来移动它 我试图找到Win32 API,但似乎没有人做这项工作 编辑:我对许多人的意见感到惊讶。让我解释一下我为什么想要它。在我的工作场所,我使用双显示器(分辨率不同),任务栏放在左显示器上,主显示器放在右显示器上。然而,我经常通过远程桌面连接到我的工作电脑。远程连接后,将切换任务栏位置。这就是

我想知道将Windows任务栏移动(或调整大小)到另一个位置(包括另一个显示器(如果是双显示器))的任何API或解决方法(例如脚本或注册表)。当然,我们可以用鼠标移动任务栏,但我想用程序或某种自动化的方式来移动它

我试图找到Win32 API,但似乎没有人做这项工作


编辑:我对许多人的意见感到惊讶。让我解释一下我为什么想要它。在我的工作场所,我使用双显示器(分辨率不同),任务栏放在左显示器上,主显示器放在右显示器上。然而,我经常通过远程桌面连接到我的工作电脑。远程连接后,将切换任务栏位置。这就是为什么我想做一个简单的程序,可以保存/恢复任务栏的位置。每天我都要重新安排我的任务栏。就这样。我只想为我设置它,任务栏是一个窗口。用来移动它。另请参见和ABM_WINDOWPOSCHANGED

尽管任务栏可能很特殊,Windows可能不喜欢你移动它。在用于任务栏的Shell appbar API实现中有许多特殊情况


要移动到其他监视器,请使用。有些显示器可能有负坐标。

SHAppBarMessage(ABM_SETPOS,…)

据我所知,Vista及以后版本会忽略任何试图移动任务栏的程序。旧方法是ABM_SETPOS+MoveWindow,这在任务栏上不再有效。我所知道的唯一仍然有效的方法是模拟鼠标移动(单击移动释放)。我读过关于这种方法的书,但我自己从来没有做过。

我在自动热键脚本中完成了这项任务,以防您不关心所使用的语言。它使用模拟的按键和鼠标移动来移动任务栏。我停止了自动解锁/锁定任务栏

最困难的部分是让它可靠地工作。许多代码专门用于确保任务栏移动。它仍然无法100%工作。。。从我所看到的情况来看,有10%的时间是失败的。然而,它应该足够好,让你开始

如果我再回到这个脚本来让它完美地工作,我会在这里重新发布

下面是示例脚本(这里突出显示有点奇怪,因为语言是AHK):

F3::
重新加载
返回
F5::
移动任务栏(2,“底部”)
返回
F6::
移动任务栏(2,“左”)
返回
F7::
移动任务栏(1,“顶部”)
返回
; 移动任务栏
; dspNumber:数字。设备编号(主显示器为1,次显示器为2…)
; 边缘:字符串。顶部、右侧、底部或左侧
移动任务栏(DSP编号,边缘)
{
批评的
OutputDebug MoveTaskbar-调用以移动任务栏以显示#%dspNumber%(“%edge%”边缘)
绝对坐标系
协作模式、鼠标、屏幕
;检查dspNumber时出错
SysGet、numMonitors、MonitorCount

如果(numMonitors我在Windows 7上也有这种需要。以下是我使用自动热键脚本实现这一点的方法:

; This script will try to drag and move the taskbar to where the *current* mouse
; cursor is

; 0x111: WM_COMMAND, 424: lock/unlock taskbar, http://www.codeproject.com/KB/miscctrl/Taskbar_Manipulation.aspx
RegRead, TaskbarLocked, HKEY_CURRENT_USER, SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced, TaskbarSizeMove
If TaskbarLocked = 0
  SendMessage 0x111, 424, , , ahk_class Shell_TrayWnd   

WinActivate ahk_class Shell_TrayWnd
MouseGetPos targetX, targetY
ControlGetPos x, y, w, h, MSTaskListWClass1, ahk_class Shell_TrayWnd
MouseMove x+1, y+1
MouseClickDrag Left, x+1, y+1, targetX, targetY, 10

; often after dragging the taskbar to left or right side of a monitor, even though
; there are enough room to show two columns of icons, it will only show one column,
; it seems showing or hiding an icon will fix this
Menu, Tray, NoIcon
Menu, Tray, Icon

; lock the taskbar if it was previously locked
If TaskbarLocked = 0
  SendMessage 0x111, 424, , , ahk_class Shell_TrayWnd   

我已经用经典窗口主题在Windows 7上对此进行了测试。要使用此功能,请指定一个热键调用此脚本,然后将鼠标光标定位到要将任务栏拖动到的位置,然后按热键。

谢谢您提出此问题

现在是Windows 10,我遇到了同样的问题,我编写了一个脚本,在两屏设置和仅用于电影的电视之间切换。切换回两屏设置后,任务栏回到了正确的显示器上,就像您所经历的那样

我找到了一个解决方案,涉及修改定义任务栏位置的注册表项

这就是所说的关键: HKEY\ U当前\用户\软件\ Microsoft\Windows\CurrentVersion\Explorer\StuckRects3

当任务栏位于正确的位置和大小时,打开注册表编辑器(Win+R,键入regedit),然后导航到上面的键路径。您应该找到一个名为“Settings”的二进制值,如下所示:

@echo off
%windir%\system32\regedit.exe /s file.reg
taskkill /f /im explorer.exe
start explorer.exe
end
30 00 00 00 fe ff ff 02 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

您的数字可能不同,但这并不重要。导航到该值后,只需单击菜单中的文件>导出操作,然后使用顶部菜单中的文件>导出选项,并将.reg文件保存在系统文件夹中(C:\Windows\System32)。确保导出范围设置为“选定分支”“因此仅此值受影响。这将创建一个注册表脚本,该脚本将恢复任务栏的确切位置

但是,如果您只是在脚本上使用“合并”选项,您将看不到更改,因为您需要重新启动explorer.exe进程。为此,您只需在noptepad中创建一个批处理脚本,如下所示:

@echo off
%windir%\system32\regedit.exe /s file.reg
taskkill /f /im explorer.exe
start explorer.exe
end
只需将第2行中的“file.reg”替换为先前创建的.reg脚本的完整文件名,然后将该文件另存为“.bat”

以管理员身份运行此脚本将使任务栏复位。您将看到ui短暂闪烁,因为任务栏和桌面将复位

您可以从任务中调用此脚本,或者创建一个设置为以管理员身份运行的快捷方式,使其更加简单

我希望你能得到这个答案,即使有点晚了


不客气!

为什么要否决?这是一个精心设计的问题。至于可疑的意图,我在这里看到了更糟糕的答案……好吧,托马斯,可以说这个问题没有用,因为这不是程序应该做的任务。然而,我们并不真正知道明江程序的意图,所以让我们一起来讨论让我们从怀疑中受益,好吗?“这不是程序应该做的任务”-真的吗?呵呵