图片 1

QQ聊天窗口有个很有意思的窗口抖动功能,其实实现起来非常容易。网上之前也有很多前辈做过此类的恶作剧软件,点击后使“受害者”的当前窗口抖个不停,当然,非常有娱乐效果。其实本文说是拿python实现是不确切的,更合理的说法应该是拿python调用win32
gui的api函数来实现窗口抖动。其实思路很简单,如下:

 
乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。 

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import httplib

httplib.HTTPConnection.debuglevel = 1
'''
200正常状态码不会有跳转 也就不会有location
conn = httplib.HTTPConnection("tu.duowan.com") #这里是host
conn.request('GET', '/m/meinv/index.html')#上面是分支 注意是GET
'''
#访问跳转的302页面就可以在headers中找到location
conn = httplib.HTTPConnection("localhost") #这里是host
conn.request('GET', '/yesearch/index.php?r=site/index')#上面是分支 注意是GET
for item in conn.getresponse().getheaders(): 
if item[0]=='location':
print item[1]
conn.close()

 

  众所周知,2的正整数次幂最后一位数总是不断的在重复2,4,8,6,2,4,8,6……我们说2的正整数次幂最后一位的循环长度是4(实际上4的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象。 

 

  1. 获取到当前窗口的句柄。可以使用GetForegroundWindow()函数来实现。

  这时乐乐的问题就出来了:是不是只有最后一位才有这样的循环呢?对于一个整数n的正整数次幂来说,它的后k位是否会发生循环?如果循环的话,循环长度是多少呢? 

 本地php构造一个redirect重定向
访问site/index 跳转到site/search路由。

 

注意: 

图片 2

2.
获取到当前窗口的坐标位置。可以使用GetWindowRect()函数来实现。此处不仅需要当前窗口的句柄,也需要我们定义一个结构体来实现坐标值得存储。

  1.如果n的某个正整数次幂的位数不足k,那么不足的高位看做是0。 

用python httplib获得的headers里面就有location

 

  2.如果循环长度是L,那么说明对于任意的正整数a,n的a次幂和a +
L次幂的最后k位都相同。

图片 3

3.
改变当前窗口的位置。可以使用SetWindowPos()函数来实现。函数原型为BOOL
SetWindowPos(HWN hWnd,HWND hWndlnsertAfter,int X,int Y,int cx,int
cy,UNIT.Flags),其中hWnd为窗口的句柄,hWndInsertAfter指在z序中的位于被置位的窗口前的窗口句柄,X指以客户坐标指定窗口新位置的左边界,Y指以客户坐标指定窗口新位置的顶边界,cx指以像素指定窗口的新的宽度,cy指以像素指定窗口的新的高度,uFlags:窗口尺寸和定位的标志。具体参数如何设置可以网上搜索查找资料。

 

python# -*- coding:utf-8
-*-import httplibhttplib.HTTPConnection.debuglevel =
1200正常状态码不会有跳转 也就不会有locationconn =
httplib.HTTPConnection…

 

【输入】

源码如下:

 

 

输入只有一行,包含两个整数n(1 <= n < 10^100)和k(1 <= k <=
100),n和k之间用一个空格隔开,表示要求n的正整数次幂的最后k位的循环长度。

 

 

import random  
import win32gui  
import win32api,win32con  

#定义结构体,存储当前窗口坐标  
class RECT(ctypes.Structure):  
    _fields_ = [('left', ctypes.c_int),  
                ('top', ctypes.c_int),  
                ('right', ctypes.c_int),  
                ('bottom', ctypes.c_int)]  
rect = RECT()  
HWND = win32gui.GetForegroundWindow()#获取当前窗口句柄  
ctypes.windll.user32.GetWindowRect(HWND, ctypes.byref(rect))#获取当前窗口坐标  
for i in range(2,200):  
    win32gui.SetWindowPos(HWND, None, rect.left+5*random.randint(1,i), rect.top-5*random.randint(1,i), rect.right-rect.left, rect.bottom-rect.top, win32con.SWP_NOSENDCHANGING|win32con.SWP_SHOWWINDOW)#实现更改当前窗口位置  
win32gui.SetWindowPos(HWND, None, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, win32con.SWP_NOSENDCHANGING|win32con.SWP_SHOWWINDOW)#将窗口恢复至初始位置  

【输出】

 

 

同时为了使每次抖动位置不一样,还使用了random模块中的randint()函数来实现每次抖动随机的位置。

输出包括一行,这一行只包含一个整数,表示循环长度。如果循环不存在,输出-1。

 

 

【样例输入】

 

32 2

 

【样例输出】

 

4

发表评论

电子邮件地址不会被公开。 必填项已用*标注