找回密码
 加入
搜索
查看: 9721|回复: 19

[原创] 大家也来模仿一下这个软件《GiMeSpace》

 火.. [复制链接]
发表于 2010-11-6 01:47:54 | 显示全部楼层 |阅读模式
本帖最后由 xyold1 于 2010-11-6 09:51 编辑

去数动论坛里看了一下,发现一个很不错的小程序,GiMeSpace
原贴:http://bbs.icpcw.com/forum.php?m ... 6amp%3Btypeid%3D165
介绍如下:
现在大家用电脑,一般都是多窗口,多任务同时运行,如果窗口一多,系统桌面就显得非常拥挤,操作不便。要是用GiMeSpace这款软件,就可以让你的桌面无限放大,而不用管显示器的大小!
  GiMeSpace翻译成中文就是给我空间的意思,顾名思义就知道这是一款让你扩大桌面使用空间的工具。首先我们安装并运行GiMeSpace,接下来就可以在当前桌面上摆放窗口。当窗口不够放的时候,将鼠标移动到桌面的左方、右方边缘,就可以无限滚动你的桌面。
  选择其中的一个窗口,然后按住鼠标左键不放进行拖拽,就可以将窗口放到任意一个位置上去。这样就可以将桌面的宽度无限放大,但同时显示的桌面区域限制在显示器的宽度。这样一来,就可以理论上放置无数个窗口,操作起来就会更加简单,不用再为找窗口而发愁。
  如果桌面拖拽的比较长,不方便操作。可以按下键盘上的Scroll Lock键,就可以暂停桌面扩展功能,再按一下,恢复正常。要是拖拽桌面实在过长,找不到想要找到窗口也没有关系。在任务栏上点击GiMeSpace图标,选择Collect windows,把所有窗口收合到目前桌面中。
  以后如果觉得自己的桌面不够大,就可以用GiMeSpace这款软件来帮忙。让桌面像画轴一样可以横向滚动,然后你可以在画布上轻松的把每个窗口放在上面,彼此绝不干扰。


当时看着很神奇,于是搜出这个软件来,运行一看,明白了,任何一个AU3入门的人都可以搞啊(想想AU3真的很强大)
于是也模仿着做了一个,功能上不如原版强,但也算是及格了吧
大家也试着做一下看看

又修改了一下,修正了上个版本的BUG,可以上下左右移动,可以调节速度,开启SCROLLLOCK不会移动窗口
另外官方的收费版还有更多的功能
- scrolling in 2 directions.
  - able to make windows bigger then your physical screen. Very useful for
    netbooks and other computer with small screens!
  - adjust scroll speed.
  - support for pen/touchscreen computers.
  - 'sticky' scrolling, no more little moves when you hit the edge.
  - select what windows should not scroll.
  - adjust move and repaint refresh rate.
  - always scrolling mode.
  - navigation panel to show and navigate your whole extended desktop.
  - do not scroll when a window is maximized.
  - Auto arrange windows next to each other.

本人作品免金币下载地址:http://cid-c490728b0747d5f6.offi ... 窗口/movewin1.rar

评分

参与人数 2金钱 +52 贡献 +3 收起 理由
sanmoking + 22 试试看,小本桌面太小
afan + 30 + 3

查看全部评分

发表于 2010-11-6 11:43:13 | 显示全部楼层
本帖最后由 menfan1 于 2010-11-6 11:48 编辑

挺有意思的哈
 楼主| 发表于 2010-11-6 22:39:00 | 显示全部楼层
回复 2# menfan1

是很有意思的程序
发表于 2010-11-6 22:43:30 | 显示全部楼层
确实挺有意思~
 楼主| 发表于 2010-11-7 21:34:08 | 显示全部楼层
原程序在,鼠标光标在屏幕边缘,并移动时,窗口才会移动,而我这个东西,只是判断了在屏幕边缘就移动,不知道怎么才能搞成那种效果
发表于 2010-11-7 22:01:05 | 显示全部楼层
创建一个透明全屏窗口,捕捉其WM_MOUSEMOVE消息
 楼主| 发表于 2010-11-7 23:28:18 | 显示全部楼层
本帖最后由 xyold1 于 2010-11-7 23:30 编辑

回复 6# afan

原来如此啊,还不能随心所欲地处理消息处理


下面是代码,有不对的还请大有指正


#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_Icon=E:\TF卡备份\mynewwork\winvista图标\Icon_35.ico
#AutoIt3Wrapper_OutFile=movewin1.exe
#AutoIt3Wrapper_Res_Description=扩展屏幕
#AutoIt3Wrapper_Res_FileVersion=1.1.0.0
#AutoIt3Wrapper_Res_LegalCopyright=小数点儿
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <WinAPIEx.au3>
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <Misc.au3>
Opt("TrayMenuMode", 1)

#Region ### START Koda GUI section ### Form=
;~ TraySetIcon("", -1)
TraySetClick("8")
$MenuItem5 = TrayCreateItem("调节速度")
TrayCreateItem("")
$MenuItem4 = TrayCreateItem("上下移动")
TrayCreateItem("")
$MenuItem3 = TrayCreateItem("还 原")
TrayCreateItem("")
$MenuItem2 = TrayCreateItem("关 于")
TrayCreateItem("")
$MenuItem1 = TrayCreateItem("退 出")
TraySetState()

#EndRegion ### END Koda GUI section ###
Global $Data
Global Const $VK_SCROLL = 0x91
HotKeySet("{esc}", 'ExitAPP')
AdlibRegister("getdata", 1000)
setini()
$mov = RegRead("HKEY_CURRENT_USER\Software\Move_WindowUD\", "speed")

If $mov = "" Then
        $mov = 10
EndIf

$loc = 5
$w = @DesktopWidth
$h = @DesktopHeight
Dim $posxx, $posyy
$dll = DllOpen("user32.dll")
TrayItemSetState($MenuItem4, RegRead("HKEY_CURRENT_USER\Software\Move_WindowUD\", "state"))
While 1
        $nMsg = TrayGetMsg()
        Switch $nMsg
                Case $MenuItem5
                        $answer = InputBox("提示", "请输入一个数字", $mov)
                        If Not @error Then
                                If Number($answer) <> 0 Then
                                        $mov = Number($answer)
                                        RegWrite("HKEY_CURRENT_USER\Software\Move_WindowUD\", "speed", "REG_DWORD", $answer)
                                EndIf
                        EndIf
                Case $MenuItem4
                        RegWrite("HKEY_CURRENT_USER\Software\Move_WindowUD\", "state", "REG_DWORD", TrayItemGetState($MenuItem4))
                Case $MenuItem3
                        rest()
                Case $MenuItem2
                        MsgBox(0, "关于", "小数点儿制作")
                Case $MenuItem1
                        ExitAPP()
        EndSwitch

        If Not _GetKeyState($VK_SCROLL) Then
                $size = WinGetPos("[active]")
                If $size[0] < -$size[2] - 20 Or $size[0] > $w + 20 Or $size[1] < -$size[3] - 20 Or $size[1] > $h + 20 Then
                        WinMove("[active]", "", ($w - $size[2]) / 2, ($h - $size[3]) / 2)
                EndIf
                $tstate = BitAND(TrayItemGetState($MenuItem4), $TRAY_CHECKED)
                $pos = MouseGetPos();返回一个包含鼠标坐标的2元素一维数组array: $array[0] = X 坐标 (横向), $array[1] = Y 坐标 (垂直)
                If $pos[0] > $w - 5 Then
                        gethwn("right")
                        If $tstate Then
                                If $pos[1] > $posyy + $loc Then
                                        gethwn("down")
                                ElseIf $pos[1] < $posyy - $loc Then
                                        gethwn("up")
                                EndIf
                        EndIf
                EndIf
                If $pos[0] < 5 Then
                        gethwn("left")
                        If $tstate Then
                                If $pos[1] > $posyy + $loc Then
                                        gethwn("down")
                                ElseIf $pos[1] < $posyy - $loc Then
                                        gethwn("up")
                                EndIf
                        EndIf
                EndIf
                If $pos[1] > $h - 5 Then
                        If $tstate Then gethwn("down")
                        If $pos[0] > $posxx + $loc Then
                                gethwn("left")
                        ElseIf $pos[0] < $posxx - $loc Then
                                gethwn("right")

                        EndIf
                EndIf
                If $pos[1] < 5 Then
                        If $tstate Then gethwn("up")
                        If $pos[0] > $posxx + $loc Then
                                gethwn("left")
                        ElseIf $pos[0] < $posxx - $loc Then
                                gethwn("right")
                        EndIf
                EndIf
                $posxx = $pos[0]
                $posyy = $pos[1]
        EndIf

WEnd
Func _GetKeyState($VK_Code)
        Local $ret = DllCall("user32.dll", "long", "GetKeyState", "long", $VK_Code)
        Return $ret[0]
EndFunc   ;==>_GetKeyState
Func rest()
        $Data = _WinAPI_EnumWindowsTop()
        For $i = 1 To $Data[0][0]

;~                         $xe=IniRead("PosSet.db",$Data[$i][0],"x","none")
;~                         $ye=IniRead("PosSet.db",$Data[$i][0],"y","none")
                $xe = RegRead("HKEY_CURRENT_USER\Software\Move_Window\" & $Data[$i][0], "x")
                $ye = RegRead("HKEY_CURRENT_USER\Software\Move_Window\" & $Data[$i][0], "y")
                If $xe = "" And $ye = "" Then
                Else
                        WinMove($Data[$i][0], "", $xe, $ye)
;~                                 IniWrite("PosSet.db",$Data[$i][0],"x",$winpos[0])
;~                         EndIf
;~                         $ye=IniRead("PosSet.db",$Data[$i][0],"y","none")
;~                         If $ye="none" Then
;~                                 IniWrite("PosSet.db",$Data[$i][0],"x",$winpos[1])
                EndIf
        Next
EndFunc   ;==>rest

Func ExitAPP()
        $Data = _WinAPI_EnumWindowsTop()
        For $i = 1 To $Data[0][0]

;~                         $xe=IniRead("PosSet.db",$Data[$i][0],"x","none")
;~                         $ye=IniRead("PosSet.db",$Data[$i][0],"y","none")
                $xe = RegRead("HKEY_CURRENT_USER\Software\Move_Window\" & $Data[$i][0], "x")
                $ye = RegRead("HKEY_CURRENT_USER\Software\Move_Window\" & $Data[$i][0], "y")
                If $xe = "" And $ye = "" Then
                Else
                        WinMove($Data[$i][0], "", $xe, $ye)
;~                                 IniWrite("PosSet.db",$Data[$i][0],"x",$winpos[0])
;~                         EndIf
;~                         $ye=IniRead("PosSet.db",$Data[$i][0],"y","none")
;~                         If $ye="none" Then
;~                                 IniWrite("PosSet.db",$Data[$i][0],"x",$winpos[1])
                EndIf
        Next
;~                 FileDelete("PosSet.db")
        RegDelete("HKEY_CURRENT_USER\Software\Move_Window\")
        DllClose($dll)
        Exit

EndFunc   ;==>ExitAPP

Func setini()
        $Data = _WinAPI_EnumWindowsTop()
        For $i = 1 To $Data[0][0]
                $state = WinGetState($Data[$i][0])
                If Not BitAND($state, 16) Or Not BitAND($state, 32) Then
                        $winpos = WinGetPos($Data[$i][0])
;~                         $xe=IniRead("PosSet.db",$Data[$i][0],"x","none")
                        $xe = RegRead("HKEY_CURRENT_USER\Software\Move_Window\" & $Data[$i][0], "x")
                        If $xe = "" Then
;~                                 IniWrite("PosSet.db",$Data[$i][0],"x",$winpos[0])
                                RegWrite("HKEY_CURRENT_USER\Software\Move_Window\" & $Data[$i][0], "x", "REG_DWORD", $winpos[0])

                        EndIf
;~                         $ye=IniRead("PosSet.db",$Data[$i][0],"y","none")
                        $ye = RegRead("HKEY_CURRENT_USER\Software\Move_Window\" & $Data[$i][0], "y")
                        If $ye = "" Then
;~                                 IniWrite("PosSet.db",$Data[$i][0],"y",$winpos[1])
                                RegWrite("HKEY_CURRENT_USER\Software\Move_Window\" & $Data[$i][0], "y", "REG_DWORD", $winpos[1])
                        EndIf
                EndIf
        Next

EndFunc   ;==>setini
Func getdata()
        $datanum = $Data
        $Data = _WinAPI_EnumWindowsTop()
        If $Data <> $datanum Then setini()
EndFunc   ;==>getdata

Func gethwn($MP)

        For $i = 1 To $Data[0][0]
                $state = WinGetState($Data[$i][0])
                $winposA = WinGetPos($Data[$i][0])
                If Not BitAND($state, 16) Then
                        Switch $MP
                                Case "left"
                                        WinMove($Data[$i][0], "", $winposA[0] + $mov, $winposA[1])
;~                         IniWrite("PosSet.db",$Data[$i][0],"xn",$winposA[0]+$mov)
                                        RegWrite("HKEY_CURRENT_USER\Software\Move_Window\" & $Data[$i][0], "xn", "REG_DWORD", $winposA[0] + $mov)
                                Case "right"
                                        WinMove($Data[$i][0], "", $winposA[0] - $mov, $winposA[1])
;~                         IniWrite("PosSet.db",$Data[$i][0],"xn",$winposA[0]-$mov)
                                        RegWrite("HKEY_CURRENT_USER\Software\Move_Window\" & $Data[$i][0], "xn", "REG_DWORD", $winposA[0] - $mov)
                                Case "up"
                                        WinMove($Data[$i][0], "", $winposA[0], $winposA[1] + $mov)
;~                         IniWrite("PosSet.db",$Data[$i][0],"yn",$winposA[1]+$mov)
                                        RegWrite("HKEY_CURRENT_USER\Software\Move_Window\" & $Data[$i][0], "yn", "REG_DWORD", $winposA[1] + $mov)
                                Case "down"
                                        WinMove($Data[$i][0], "", $winposA[0], $winposA[1] - $mov)
;~                         IniWrite("PosSet.db",$Data[$i][0],"yn",$winposA[1]-$mov)
                                        RegWrite("HKEY_CURRENT_USER\Software\Move_Window\" & $Data[$i][0], "yn", "REG_DWORD", $winposA[1] - $mov)
                        EndSwitch


                EndIf

        Next
EndFunc   ;==>gethwn
 楼主| 发表于 2010-11-7 23:32:29 | 显示全部楼层
很无奈地使用了注册表,不知还有优化方法吗?
发表于 2010-11-12 17:38:29 | 显示全部楼层
很强大的一个工具。谢谢分享,目前没有办法做这个东西 ,不会。我会关注你的。
发表于 2010-11-12 22:49:16 | 显示全部楼层
我也来试试哈  你们大家都来啊
发表于 2010-11-12 23:13:51 | 显示全部楼层
怎么会自动退出的
 楼主| 发表于 2010-11-13 22:39:45 | 显示全部楼层
回复 9# chenronting

谢谢,相互学习
 楼主| 发表于 2010-11-13 22:42:12 | 显示全部楼层
回复 11# tryhi


我这里运行正常,你可以跑一下原代码看看
发表于 2010-11-14 07:54:50 | 显示全部楼层
回复 13# xyold1


    我这里也正常。不过点右下角还原的时候,会出现数组超出。
 楼主| 发表于 2010-11-14 08:05:18 | 显示全部楼层
回复 14# chenronting



我再测试
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-18 08:29 , Processed in 0.081023 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表