2016-12-28 6 views
-1

Когда я загружаю свой компьютер, я открываю несколько файловых исследователей и сортирую их по экрану, чтобы ускорить мой рабочий процесс. Это не требует много времени, только утомительно, и я бы хотел, чтобы небольшая программа сделала это для меня. Я знаю, как открыть проводник, но я не вижу никаких позиционных аргументов.Открыть проводник файла в координатах

Есть ли способ запустить файловый обозреватель при наборе экранных координат или переместить его программно после его открытия? Предпочтительно с python 3+, но пакет также будет работать.

+3

см http://superuser.com/questions/747900/open-browser-window-at-specified-screen-coordinates – Richard

+0

Похоже, что нет никакого способа сделать это без дополнительных инструментов третьих сторон, которые я не может получить доступ к моей сети. Как жаль. Спасибо за ссылку. – DCOPTimDowd

+2

Я мог бы поклясться, что ответил на такой вопрос давным-давно (ответ заключается в том, что PowerShell использует Win32 API), но я не могу его найти. Если этот вопрос по-прежнему открыт, когда я вернусь с работы, тогда я отправлю код. – SomethingDark

ответ

3

Это было одновременно легче и сложнее, чем я думал, что это будет. Все прокомментировано, дайте мне знать, если у вас есть еще вопросы. Это гибридный сценарий PowerShell/пакет (так что сохраните его как .bat-файл), потому что PowerShell отключен по умолчанию или что-то в системах.

<# : 
:: Based on https://gist.github.com/coldnebo/1148334 
:: Converted to a batch/powershell hybrid via http://www.dostips.com/forum/viewtopic.php?p=37780#p37780 
:: Array comparison from http://stackoverflow.com/a/6368667/4158862 
@echo off 
setlocal 
set "POWERSHELL_BAT_ARGS=%*" 
if defined POWERSHELL_BAT_ARGS set "POWERSHELL_BAT_ARGS=%POWERSHELL_BAT_ARGS:"=\"%" 
endlocal & powershell -NoLogo -NoProfile -Command "$_ = $input; Invoke-Expression $('$input = $_; $_ = \"\"; $args = @(&{ $args } %POWERSHELL_BAT_ARGS%);' + [String]::Join([char]10, $(Get-Content \"%~f0\")))" 
goto :EOF 
#> 

# Create an instance of the Win32 API object to handle and manipulate windows 
Add-Type @" 
    using System; 
    using System.Runtime.InteropServices; 

    public class Win32 { 
    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); 
    } 
"@ 

# Get a list of existing Explorer Windows 
$previous_array = @() 
$shell_object = New-Object -COM 'Shell.Application' 

foreach($old_window in $shell_object.Windows()) 
{ 
    $previous_array += $old_window.HWND 
} 

# Open four more Explorer Windows in the current directory 
explorer 
explorer 
explorer 
explorer 

# Pause for 1 second so that the windows have time to finish opening 
sleep 1 

# Get the list of new Explorer Windows 
$new_array = @() 
foreach($new_window in $shell_object.Windows()) 
{ 
    $new_array += $new_window.HWND 
} 

# Compare the two arrays and only process the new windows 
$only_new = Compare-Object -ReferenceObject $previous_array -DifferenceObject $new_array -PassThru 

# MoveWindow takes HWND value, X-position on screen, Y-position on screen, window width, and window height 
# I've just hard-coded the values, adjust them to suit your needs 
[Win32]::MoveWindow($only_new[0],0,0,960,540,$true) 
[Win32]::MoveWindow($only_new[1],960,0,960,540,$true) 
[Win32]::MoveWindow($only_new[2],0,540,960,540,$true) 
[Win32]::MoveWindow($only_new[3],960,540,960,540,$true) 
+1

Nice trick !! +1 – Aacini

+1

Это супер круто! И он работает на нескольких экранах без каких-либо дополнительных API-интерфейсов! Именно то, что я хотел. :) – DCOPTimDowd

+0

Единственное, что я добавил, это пауза между секундами каждого окна, поэтому они были в том порядке, в котором они мне были нужны. Я попробовал метод ['ping'] (https://www.experts-exchange.com/articles/17805/Inserting-Delays-with-Millisecond-Resolution-in-Windows-Batch-bat-Files.html), но половина секунды была недостаточно длинной для некоторых, поэтому пошел со сном. – DCOPTimDowd

 Смежные вопросы

  • Нет связанных вопросов^_^