真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

vb.Net作屏幕保護(hù) vbs鎖屏

關(guān)于VB屏幕保護(hù)問題--求助

熟悉Windows操作系統(tǒng)的朋友一定對Windows的屏幕保護(hù)程序不陌生吧。如何自己編寫Windows屏幕保護(hù)程序呢?當(dāng)你看完下面的講解后便可以輕易地編寫一標(biāo)準(zhǔn)的Windows屏幕保護(hù)程序了!

前鋒網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,前鋒網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為前鋒1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的前鋒做網(wǎng)站的公司定做!

一個標(biāo)準(zhǔn)的屏保有以下幾個特點(diǎn):

一:它是以.SCR作為文件的擴(kuò)展名!

二:它有三種運(yùn)行方式。

(1)運(yùn)行在預(yù)覽框中(用于預(yù)覽屏保的效果。在“顯示屬性”→“屏幕保護(hù)程序”→“小屏幕”)。(見圖)

(2)運(yùn)行設(shè)置程序(用于設(shè)置一些相關(guān)的樣式。在“顯示屬性”→“屏幕保護(hù)程序”→“點(diǎn)擊設(shè)置按鈕”)。

(3)真正的運(yùn)行屏保(屏保運(yùn)行時(shí)的效果。在“顯示屬性”→“屏幕保護(hù)程序”→“點(diǎn)擊預(yù)覽”或鼠標(biāo)、鍵盤在指定的時(shí)間內(nèi)無動作時(shí))。

如何讓屏保識別當(dāng)前需要運(yùn)行哪一種方式呢?答案很簡單——分析Windows調(diào)用屏保的參數(shù)。下面以Windows 98為例向大家分析一下調(diào)用屏保的參數(shù)。

當(dāng)Windows需要屏保顯示在“小屏幕”中時(shí)會在調(diào)用屏保的后面加上兩個參數(shù)。

如:myscr.scr /p 7981(參數(shù)一:/p 表示讓程序顯示在“小屏幕”里,參數(shù)二:7981表示“小屏幕”的句柄hWnd。這樣屏保就會得知Windows要它顯示在“小屏幕”中。)

當(dāng)Windows需要屏保顯示設(shè)置對話框時(shí)會在調(diào)用屏保的后面不加或加上兩個參數(shù)。

如:myscr.scr或myscr.scr /C 7987(參數(shù)一:/C表示讓程序顯示設(shè)置對話框,參數(shù)二:7987表示該屬性頁的句柄。)

當(dāng)Windows需要運(yùn)行屏保時(shí)會在調(diào)用屏保的后面加上一個參數(shù)。

如:myscr.scr /S(參數(shù):/S表示讓屏保運(yùn)行。)

好了,知道了Windows如何讓屏保運(yùn)行的三種方式后,接下來就要討論如何實(shí)現(xiàn)它們了。

實(shí)現(xiàn)原理:Windows通過某種方式調(diào)用屏保,屏保知道了它此時(shí)要干什么便會在當(dāng)前環(huán)境中搜索是否有相同的實(shí)例存在。如果該實(shí)例的運(yùn)行方式與此次要啟動的運(yùn)行方式不同則關(guān)閉前個實(shí)例,如果該實(shí)例的運(yùn)行方式與此次要啟動的運(yùn)行方式相同則關(guān)閉此次運(yùn)行的實(shí)例。

顯然要實(shí)現(xiàn)這種方法靠VB的App.PrevInstance是不可行的。因?yàn)槲覀円_(dá)到的目的是:偵測到前一個實(shí)例后要關(guān)閉它然后啟動程序。而App.PrevInstance屬性只能返回當(dāng)前是否已啟動一個應(yīng)用程序的實(shí)例而不能對前個實(shí)例做些什么。(實(shí)例 簡單地說就是相同的對象集合——同一程序。)在實(shí)現(xiàn)此方法之前首先向大家介紹三條API函數(shù):GetClassName、FindWindow和SendMessage。其原型如下:

Declare Function GetClassName Lib “user32” Alias “GetClassNameA” (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long

Declare Function FindWindow Lib “user32” Alias “FindWindowA” (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Declare Function SendMessage Lib “user32” Alias “SendMessageA” (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

GetClassName用于取得窗體的類名。調(diào)用成功后返回類名長度,失敗返回零。函數(shù)需要三個參數(shù):參數(shù)一.窗體的句柄,參數(shù)二.存放類名的緩沖,參數(shù)三.緩沖的大小。

FindWindow用于尋找窗體。調(diào)用成功后返回窗體的句柄,失敗返回零。函數(shù)需要兩個參數(shù):參數(shù)一.窗體的類名,參數(shù)二.窗體的標(biāo)題。

SendMessage用于向窗體發(fā)送一消息。函數(shù)需要四個參數(shù):參數(shù)一.窗體的句柄,參數(shù)二:發(fā)送的消息名稱,參數(shù)三、四.分別表示消息所附帶的參數(shù)。

使用了這三個函數(shù)便可輕易地實(shí)現(xiàn)關(guān)閉前有一個已啟動的實(shí)例從而達(dá)到我們的目的。

其次我們要實(shí)現(xiàn)如何讓屏幕保護(hù)程序顯示在預(yù)覽框中(“小屏幕”)。

要讓屏幕保護(hù)程序在預(yù)覽框中顯示必須動態(tài)地改變窗口的樣式使之成為“小屏幕”的子窗體,這樣才能使預(yù)覽框關(guān)閉時(shí)得到關(guān)閉消息。動態(tài)地改變窗口的樣式可以使用GetWindowLong、SetWindowLong和SetParent。

它們的原型如下:

Public Declare Function GetWindowLong Lib “user32” Alias “GetWindowLongA” (ByVal hwnd As Long, ByVal nIndex As Long) As Long Public Declare Function SetWindowLong Lib “user32” Alias “SetWindowLongA” (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Declare Function SetParent Lib “user32” (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long

GetWindowLong的作用用于得到窗體的樣式。調(diào)用成功后返回窗體的樣式。函數(shù)需要兩個參數(shù):參數(shù)一.窗體的句柄,參數(shù)二.要取得窗體的樣式只需使用常數(shù)GWL_STYLE。

SetWindowLong的作用用于設(shè)置窗體的樣式。函數(shù)需要三個參數(shù):參數(shù)一.窗體的句柄,參數(shù)二.要設(shè)置窗體的樣式只需用常數(shù)GWL_STYLE,參數(shù)三.要設(shè)置窗體的樣式。

SetParent的作用用于設(shè)置子窗體屬于哪個父窗體。函數(shù)需要兩個參數(shù):參數(shù)一.子窗體的句柄,參數(shù)二.父窗體的句柄。

知道了以上兩點(diǎn)就可編寫出標(biāo)準(zhǔn)的屏保。(關(guān)于效果就看你自己的了!)紙上談兵了一陣就要落實(shí)到真正的編程上了。為了著重講解屏保的實(shí)現(xiàn)方法故將屏保的效果簡單化。

首先新建一工程再添加一窗口,各屬性設(shè)置如下:

窗口 名稱 Caption BorderStyle

Form1 Frm_Setup 無 1 - None

Form2 Frm_Run 任意 1 - Fixed Single

其余屬性均缺省。再在Frm_Run中添加一Timer控件,將該控件的名稱改為Timer_Mov,Interval屬性制改為500。

添加兩個模塊,將Module1的名稱改為Mod_Const,Module2的名稱改為Mod_Main,添加以下代碼:

Mod_Const:

Option Explicit

Public Const WM_LOOK=“屏保預(yù)覽(demo)”

Public Const WM_SET=“屏保設(shè)置(demo)”

Public Const WM_RUN=“屏保運(yùn)行(demo)”

Public Const HWND_TOP=0&

Public Const WS_CHILD=&H40000000

Public Const GWL_STYLE=(-16)

Type RECT

Left As Long

Top As Long

Right As Long

Bottom As Long

End Type

Public Const SWP_NOZORDER=&H4

Public Const SWP_NOACTIVATE=&H10

Public Const SWP_SHOWWINDOW=&H40

Public Const WM_CLOSE=&H10

Declare Function GetClientRect Lib “user32” (ByVal hwnd As Long, lpRect As RECT) As Long

Declare Function GetClassName Lib “user32” Alias “GetClassNameA” (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long

Declare Function FindWindow Lib “user32” Alias “FindWindowA” (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Declare Function SendMessage Lib “user32” Alias “SendMessageA” (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Declare Function SetParent Lib “user32” (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long

Public Declare Function GetWindowLong Lib “user32” Alias “GetWindowLongA” (ByVal hwnd As Long, ByVal nIndex As Long) As Long

Public Declare Function SetWindowLong Lib “user32” Alias “SetWindowLongA” (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Declare Function SetWindowPos Lib “user32” (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Declare Function ShowCursor Lib “user32” (ByVal bShow As Long) As Long

Mod_Main:

Option Explicit

Sub Main() '程序運(yùn)行入口

Dim ClassName As String * 64 ’存放窗口的類名

Dim ExeCmd As String '存放命令行參數(shù)

GetClassName Frm_Setup.hwnd, ClassName, 64 ’取得窗口的類名

ExeCmd=UCase(Command$) ’將調(diào)用的屏保的參數(shù)轉(zhuǎn)換成大寫后存放在變量ExeCmd里

If Not (InStr(ExeCmd,“/P”)=0)Then ’檢查屏保的調(diào)用參數(shù)中是否有“/P”參數(shù)

If Not (FindWindow(ClassName, WM_LOOK)=0)Then End ’如果找到已有同一個運(yùn)行方式的實(shí)例存在則程序結(jié)束

ClosePreWindow ClassName, WM_SET ’關(guān)閉前面已啟動的其他運(yùn)行方式的實(shí)例

ClosePreWindow ClassName, WM_RUN ’同上

SCR_Look

ElseIf Not (InStr(ExeCmd,“/S”)=0)Then

If Not (FindWindow(ClassName,WM_RUN)=0) Then End

ClosePreWindow ClassName, WM_LOOK ’同上

ClosePreWindow ClassName, WM_SET ’同上

Scr_Run

Else

If Not (FindWindow(ClassName, WM_SET)=0) Then End

ClosePreWindow ClassName, WM_LOOK ’同上

ClosePreWindow ClassName, WM_RUN ’同上

Scr_Setup

End If

End Sub

Public Sub ClosePreWindow(ClassName As String, WinCaption As String)

Dim PreWnd As Long

PreWnd=FindWindow(ClassName, WinCaption) ’尋找類名為ClassName,標(biāo)題為WinCaption的窗口

If Not (PreWnd = 0) Then Call SendMessage(PreWnd, WM_CLOSE, 0, 0) ’如果窗口已找到則關(guān)閉它

End Sub

Public Sub SCR_Look()

Dim LookScrWnd As Long

Dim Style As Long

Dim LookRect As RECT

Frm_Run.Caption=WM_LOOK ’賦上具有相應(yīng)運(yùn)行方式的標(biāo)題

LookScrWnd=Val(Right(Command$, Len(Command$) - 2)) ’取得小屏幕的窗口句柄

Style=GetWindowLong(Frm_Run.hwnd, GWL_STYLE) ’取得窗口的樣式

Style=Style Or WS_CHILD ’在窗口的樣式中加入子窗體常數(shù)

SetWindowLong Frm_Run.hwnd, GWL_STYLE, Style ’改變窗體的樣式

SetParent Frm_Run.hwnd, LookScrWnd ’設(shè)置窗體的父窗體

GetClientRect LookScrWnd, LookRect ’取得小屏幕的大小

SetWindowPos Frm_Run.hwnd, HWND_TOP, 0, 0, LookRect.Right, LookRect.Bottom, SWP_

NOZORDER Or SWP_NOACTIVATE Or SWP_SHOWWINDOW

'顯示窗體并將窗體的大小設(shè)置為小屏幕的大小以便覆蓋小屏幕

End Sub

Public Sub Scr_Setup()

Frm_Run.Caption=WM_SET ’賦上具有相應(yīng)運(yùn)行方式的標(biāo)題

Frm_Setup.Show

End Sub

Public Sub Scr_Run()

Frm_Run.Caption = WM_RUN ’賦上具有相應(yīng)運(yùn)行方式的標(biāo)題

ShowCursor False ’隱藏鼠標(biāo)

Frm_Run.Move 0, 0, Screen.Width, Screen.Height

Frm_Run.Show

End Sub

Public Sub CloseSCR()

ShowCursor True ’顯示鼠標(biāo)

Unload Frm_Setup ’卸載窗體關(guān)閉屏保

Unload Frm_Run ’同上

End Sub

Public Function Scan_RUN() As Boolean’偵測當(dāng)前屏保的運(yùn)行方式

If (Frm_Run.Caption = WM_RUN) Then ’如果屏保是以運(yùn)行方式在運(yùn)行則返回“真”,否則返回“假”

Scan_RUN=True

Else

Scan_RUN=False

End If

End Function

Frm_Run:

Option Explicit

Dim i As Integer ’定義循環(huán)變量

Dim OldX As Integer ’定義存放舊的鼠標(biāo)水平坐標(biāo)

Dim OldY As Integer ’定義存放舊的鼠標(biāo)垂直坐標(biāo)

Dim Pic(1) As New StdPicture ’定義一個圖片類的數(shù)組

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

If Mod_Main.Scan_RUN Then ’如果此時(shí)是在運(yùn)行屏保則關(guān)閉屏保

Mod_Main.CloseSCR

End If

End Sub

Private Sub Form_Load()

i=1 ’為循環(huán)變量賦初值

OldX=-1 ’為舊鼠標(biāo)水平坐標(biāo)賦初值

OldY=-1 ’為舊鼠標(biāo)垂直坐標(biāo)賦初值

Set Pic(0)=LoadPicture(請寫入圖片一的路徑和名稱) ’讀取圖片一

Set Pic(1)=LoadPicture(請寫入圖片二的路徑和名稱) ’讀取圖片二

End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y A

s Single)

If Mod_Main.Scan_RUN Then ’如果此時(shí)是在運(yùn)行屏保則關(guān)閉屏保

Mod_Main.CloseSCR

End If

End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Mod_Main.Scan_RUN Then

If (OldX=-1) And (OldY=-1) Then

OldX=X

OldY=Y

Else

If (ScaleX(Abs(X-OldX),vbTwips,vbPixels)= 3) Then

Mod_Main.CloseSCR ’將鼠標(biāo)當(dāng)前的水平坐標(biāo)和垂直坐標(biāo)與舊鼠標(biāo)的水平坐標(biāo)和垂直坐標(biāo)相減其絕對值如果大于3個像素則退出屏保

End If

End If

End If

End Sub

Private Sub Form_Unload(Cancel As Integer)

Mod_Main.CloseSCR ’關(guān)閉屏保

End Sub

Private Sub Timer_Mov_Timer()

If (i=2) Then

i=1 ’如果循環(huán)變量大于圖片的數(shù)量則變量賦為1

Else

i=i+1 ’否則循環(huán)變量加一

End If

Frm_Run.PaintPicture Pic(i-1),0,0,Width,Height,0,0,ScaleX(Pic(i-1).Width,vbHimetric,vbTwips),ScaleY(Pic(i-1).Height,vbHimetric,vbTwips)’在Frm_Run上畫圖

End Sub

Frm_Setup:

Option Explicit

Private Sub Com_OK_Click()

Mod_Main.CloseSCR

End Sub

Private Sub Form_Unload(Cancel As Integer)

Mod_Main.CloseSCR

End Sub

好了,一個標(biāo)準(zhǔn)的屏幕保護(hù)程序就編寫好了。按下F5運(yùn)行試試看。不要忘了生成EXE文件時(shí)一定要將屏保的擴(kuò)展名改為SCR并將其拷貝到Windows的System目錄里才可在屏保設(shè)置中見到喔?。ǔ绦蛟赩B 5.0中編寫并運(yùn)行通過。)

vb點(diǎn)虐 屏幕保護(hù)程序

系統(tǒng)就有這個屏保啊!~!

Option EXPlicit

Dim quitflag As Boolean '聲明終止程序標(biāo)志變量

Dim lleft

'聲明隱藏或顯示鼠標(biāo)的API函數(shù)

Private Declare Function ShowCursor Lib "user32"

(ByVal bShow As Long) As Long

'檢測鼠標(biāo)單擊或移動

Private Sub Form_Click()

quitflag = True

End Sub

Private Sub Form_MouseMove(Button As Integer,Shift As Integer, X As Single, Y As Single)

Static xlast, ylast

Dim xnow As Single

Dim ynow As Single

xnow = X

ynow = Y

If xlast = 0 And ylast = 0 Then

xlast = xnow

ylast = ynow

Exit Sub

End If

If xnow xlast Or ynow ylast Then

quitflag = True

End If

End Sub

'檢測按鍵

Private Sub Form_KeyDown(KeyCode As Integer,Shift As Integer)

quitflag = True

End Sub

Private Sub Form_Load()

Dim X As Long

lleft = 0

'橫向滾動文字的起始X坐標(biāo)

If App.PrevInstance = True Then

'用APP對象的PrevInstance屬性

Unload Me

'防止同時(shí)運(yùn)行屏幕保護(hù)程序的兩個實(shí)例

Exit Sub

End If

Select Case Ucase$(Left$(Command$, 2))

'裝載命令行參數(shù)

Case "/S" '在顯示器屬性對話框中單擊了

預(yù)覽按鈕或屏幕保護(hù)程序被系統(tǒng)正常調(diào)用。

Show

'全屏顯示Form1窗體

Randomize

'初始化隨機(jī)數(shù)生成器

X = ShowCursor(False)

'隱藏鼠標(biāo)

BackColor = VBBlack

Do

Timer2.Enabled = True

'啟動Timer2 ,顯示屏幕保護(hù)滾動文字

DoEvents

'轉(zhuǎn)讓控制權(quán),以便檢測鼠標(biāo)和按鍵行為

Loop Until quitflag = True

'運(yùn)行屏幕保護(hù)滾動文字直至有鼠標(biāo)和按鍵行為

Timer2.Enabled = False

'終止?jié)L動文字

Timer1.Enabled = True

'啟動Timer1,退出屏幕保護(hù)程序

Case Else

Unload Me

Exit Sub

End Select

End Sub

Private Sub Form_Unload(Cancel As Integer)

Dim X

X = ShowCursor(True)

'顯示鼠標(biāo)

End Sub

Private Sub Timer1_Timer()

Unload Me

'退出屏幕保護(hù)程序

End Sub

Private Sub Timer2_Timer()

顯示橫向滾動文字

lleft = lleft + 100

If lleft = 11810 Then

lleft = 0

Lab1.Top = Int(Rnd * 7000)

End If

Lab1.Left = lleft

Timer2.Enabled = False

End Sub

用vb,net怎么做屏幕保護(hù)程序啊

用Visual C#編寫屏幕保護(hù)程序

Visual C#是微軟公司推出的新一代程序開發(fā)語言,是微軟.Net框架中的一個重要組成部分。屏幕保護(hù)程序是以scr為擴(kuò)展名的標(biāo)準(zhǔn)Windows可執(zhí)行程序。屏幕保護(hù)程序不僅可以延長顯示器的使用壽命,還可以保護(hù)私人信息。本文向大家介紹一個.Net平臺上用C#編寫的一個動態(tài)文本及圖形的屏幕保護(hù)程序。

一、具體實(shí)現(xiàn)步驟:

(1)在Visual Studio.Net下新建一個C#的Windows應(yīng)用程序工程,不妨命名為screen_saver。

(2)現(xiàn)在我們來設(shè)計(jì)程序的主界面:

先將窗體的Name屬性設(shè)置為screen、Text屬性設(shè)置為空,BackColor屬性設(shè)置為Black、Size屬性設(shè)置為(800, 600)、 ControlBox、MaximizeBox、MinimizeBox、ShowInTaskbar屬性設(shè)置均為false、FormBorderStyle屬性設(shè)置為None。再往窗體上添加Label控件、PictureBox控件、Timer控件各一個。將Label控件的Name設(shè)置為word、Text屬性設(shè)置為空;將PictureBox控件的Name設(shè)置為picture1、Image設(shè)置為一個預(yù)知圖片;將Timer控件的Name設(shè)置為timerSaver、Enabled 屬性設(shè)為true、Interval屬性設(shè)為5。

(3)現(xiàn)在我們開始編寫完整程序代碼部分:

//導(dǎo)入使用到的名稱空間

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

file://

namespace screen_saver

{

///

/// Form1 的摘要說明。

///

public class screen : System.Windows.Forms.Form

{

file://加入私有成員變量

private System.ComponentModel.IContainer components;

private int iSpeed = 2;

private string str="福建南紡股份公司計(jì)算機(jī)中心";

file://定義文本字體及大小

private System.Drawing.Font TextStringFont = new System.Drawing.Font ("宋體”, 10,System.Drawing.FontStyle.Bold);

private Color TextStringcolor =System.Drawing.Color.Yellow; file://文本字體顏色

private int iDistance;

private int ixStart= 0;

private int iyStart= 0;

private int speed;

private int x1,y1;

int width1,height1;

private System.Windows.Forms.Timer timerSaver; file://計(jì)時(shí)器控件

private System.Windows.Forms.PictureBox picture1; file://圖形控件

private System.Windows.Forms.Label word; file://文本顯示控件

///

/// 必需的設(shè)計(jì)器變量。

///

public screen()

{

file://

// Windows 窗體設(shè)計(jì)器支持所必需的

file://

InitializeComponent();

word.Font=TextStringFont;

word.ForeColor=TextStringcolor;

System.Windows.Forms.Cursor.Hide(); file://隱藏光標(biāo)

file://

// TODO: 在 InitializeComponent 調(diào)用后添加任何構(gòu)造函數(shù)代碼

file://

}

///

/// 清理所有正在使用的資源。

///

protected override void Dispose( bool disposing )

{

if( disposing )

{

if (components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}

#region Windows Form Designer generated code

///

/// 設(shè)計(jì)器支持所需的方法 - 不要使用代碼編輯器修改

/// 此方法的內(nèi)容。

///

private void InitializeComponent() file://初始化程序中使用到的組件

{

this點(diǎn)抗 ponents = new System.ComponentModel.Container();

System.Resources.ResourceManager resources = new system.Resources.ResourceManger(typeof(screen));

this.word = new System.Windows.Forms.Label();

this.timerSaver = new System.Windows.Forms.Timer(this點(diǎn)抗 ponents);

this.picture1 = new System.Windows.Forms.PictureBox();

this.SuspendLayout();

//

// 設(shè)置文本顯示控件(word)屬性

this.word.ForeColor = System.Drawing.Color.Yellow;

this.word.Location = new System.Drawing.Point(624, 8);

this.word.Name = "word";

this.word.Size = new System.Drawing.Size(168, 16);

this.word.TabIndex = 0;

this.word.Visible = false;

//

// 設(shè)置計(jì)時(shí)器控件(timerSaver)屬性

this.timerSaver.Enabled = true;

this.timerSaver.Interval = 5;

this.timerSaver.Tick += new System.EventHandler(this.timerSaver_Tick);

//

// 設(shè)置圖片控件(picture1)屬性

this.picture1.Image = ((System.Drawing.Bitmap)(resources.GetObject("picture1.Image")));

this.picture1.Location = new System.Drawing.Point(800, 600);

this.picture1.Name = "picture1";

this.picture1.Size = new System.Drawing.Size(304, 224);

this.picture1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;

this.picture1.TabIndex = 1;

this.picture1.TabStop = false;

//

// 設(shè)置窗體(screen)屬性

this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);

this.BackColor = System.Drawing.Color.Black;

this.ClientSize = new System.Drawing.Size(800, 600);

this.ControlBox = false;

this.Controls.AddRange(new System.Windows.Forms.Control[] {this.picture1,this.word});

this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;

this.KeyPreview = true;

this.MaximizeBox = false;

this.MinimizeBox = false;

this.Name = "screen";

this.ShowInTaskbar = false;

this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;

this.WindowState = System.Windows.Forms.FormWindowState.Maximized;

file://鍵盤按下響應(yīng)事件

this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.screen_KeyDown);

file://鼠標(biāo)按下響應(yīng)事件

this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.screen_MouseDown);

file://窗體啟動調(diào)用事件

this.Load += new System.EventHandler(this.Form1_Load);

file://鼠標(biāo)移動響應(yīng)事件

this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.screen_MouseMove);

this.ResumeLayout(false);

}

#endregion

///

/// 應(yīng)用程序的主入口點(diǎn)。

///

[STAThread]

static void Main(string[] args)

{

if(args.Length==1)

if(args[0].Substring(0,2).Equals("/c"))

{

MessageBox.Show("沒有設(shè)置項(xiàng)功能","C# Screen Saver");

Application.Exit();

}

else if(args[0]=="/s")

Application.Run(new screen());

else if(args[0]=="/a")

{

MessageBox.Show("沒有口令功能","C# Screen saver");

Application.Exit();

}

else

Application.Run(new screen());

}

private void Form1_Load(object sender, System.EventArgs e)

{

speed=0;

System.Drawing.Rectangle ssWorkArea=System.Windows.Forms.Screen.GetWorkingArea(this);

file://屏幕顯示區(qū)域

width1=ssWorkArea.Width; file://屏幕寬度

height1=ssWorkArea.Height; file://屏幕高度

}

private void timerSaver_Tick(object sender, System.EventArgs e) file://計(jì)時(shí)器響應(yīng)事件

{

word.Visible=true;

word.Text=str;

word.Height=word.Font.Height; file://設(shè)置文本的高度

word.Width=word.Text.Length*(int)word.Font.Size*2; file://設(shè)置文本的寬度

PlayScreenSaver();

}

private void PlayScreenSaver() file://自定義函數(shù)

{

file://下面設(shè)置文本顯示框的位置坐標(biāo)

word.Location =new System.Drawing.Point(width1-iDistance,word.Location.Y);

word.Visible=true; file://設(shè)置為可見

iDistance+=iSpeed;

if(word.Location.X=-(word.Width))

{

iDistance=0;

if(word.Location.Y==0)

word.Location=new System.Drawing.Point(word.Location.X,height1/2);

else if(word.Location.Y==height1/2)

word.Location=new System.Drawing.Point(word.Location.X,height1-word.Height);

else

word.Location=new System.Drawing.Point(word.Location.X,0);

}

file://下面是計(jì)算圖片框移動坐標(biāo)

speed++;

if(speed=2*height1)

{

x1=System.Math.Abs(width1-speed);

y1=System.Math.Abs(height1-speed);

}

else if(speed2*height1 speed=2*width1)

{

x1=System.Math.Abs(width1-speed);

y1=System.Math.Abs(height1-(speed-speed/height1*height1));

}

else if(speed2*width1 speed=3*height1)

{

x1=System.Math.Abs(width1-(speed-speed/width1*width1));

y1=System.Math.Abs(height1-(speed-speed/height1*height1));

}

else if(speed3*height1 speed4*height1)

{

x1=System.Math.Abs(width1-(speed-speed/width1*width1));

y1=System.Math.Abs(speed-speed/height1*height1);

}

else if(speed=4*height1 speed5*height1)

{

x1=System.Math.Abs(speed-speed/width1*width1);

y1=System.Math.Abs(height1-(speed-speed/height1*height1));

}

else if(speed=5*height1 speed4*width1)

{

x1=System.Math.Abs(speed-speed/width1*width1);

y1=System.Math.Abs(speed-speed/height1*height1);

}

else if(speed=4*width1 speed6*height1)

{

x1=System.Math.Abs(width1-(speed-speed/width1*width1));

y1=System.Math.Abs(speed-speed/height1*height1);

}

else if(speed=6*height1 speed5*width1)

{

x1=System.Math.Abs(width1-(speed-speed/width1*width1));

y1=System.Math.Abs(height1-(speed-speed/height1*height1));

}

else if(speed=5*width1 speed7*height1)

{

x1=System.Math.Abs(speed-speed/width1*width1);

y1=System.Math.Abs(height1-(speed-speed/height1*height1));

}

else if(speed=7*height1 speed6*width1)

{

x1=System.Math.Abs(speed-speed/width1*width1);

y1=System.Math.Abs(speed-speed/height1*height1);

}

if(speed==6*width1)

speed=0;

picture1.Location=new System.Drawing.Point(x1,y1);

}

private void StopScreenSaver() file://停止屏幕保護(hù)程序運(yùn)行

{

System.Windows.Forms.Cursor.Show();

timerSaver.Enabled=false;

Application.Exit();

}

private void screen_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)

file://鼠標(biāo)移動事件

{

if(ixStart==0 iyStart==0)

{

ixStart=e.X;

iyStart=e.Y;

return;

}

else if(e.X!=ixStart||e.Y!=iyStart)

StopScreenSaver();

}

private void screen_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

file://鼠標(biāo)按下事件

{

StopScreenSaver(); file://停止運(yùn)行屏幕保護(hù)程序

}

private void screen_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)

file://鍵盤按下事件

{

StopScreenSaver(); file://停止運(yùn)行屏幕保護(hù)程序

}

}

}

最后運(yùn)行該程序,把screen_saver.exe改為screen_saver.scr,拷入Windows系統(tǒng)目錄中,這樣就可以運(yùn)行該屏幕

用VB制做可換圖片的屏幕保護(hù)程序

VC++可謂神通廣大,如果學(xué)到家了,或者就掌握了那么一點(diǎn)MFC,你也會感到它的方便快捷,當(dāng)然最重要的是功能強(qiáng)大。不是嗎,從最基本的應(yīng)用程序.EXE到動態(tài)連接庫DLL,再由風(fēng)靡網(wǎng)上的ActiveX控件到Internet Server API,當(dāng)然,還有數(shù)據(jù)庫應(yīng)用程序……瞧,我都用它來做屏幕保護(hù)程序了。一般的屏幕保護(hù)程序都是以SCR作為擴(kuò)展名,并且要放在c:\windows 目錄或 c:\windows\system 目錄下,由Windows 98內(nèi)部程序調(diào)用(Windows NT 是在 c:\windows\system32 目錄下)。怎么調(diào)用?不用說了,這誰不知道。

好了,我們來作一個簡單的。選擇MFC AppWizard(exe),Project Name 為MyScreensaver,[NEXT],對話框,再后面隨你了。打開菜單Project、Settings,在Debug頁、Executable for debug session項(xiàng),以及Link頁中Output file name項(xiàng)改為c:\windows\MyScreensaver.scr,這樣,你可以調(diào)試完后,直接在VC中運(yùn)行(Ctrl+F5),便可看到結(jié)果。當(dāng)然,這樣做的唯一缺點(diǎn)是你必須手動清除Windows 目錄下的垃圾文件(當(dāng)然是在看到滿意結(jié)果后;還有,你可借助SafeClean 這個小東東來幫你清除,除非你的硬盤大的讓你感到無所謂……快快快回來,看我跑到那里去了)。接下來用Class Wizard生成CMyWnd類,其基類為CWnd(在Base Class 中為generic CWnd)。這個類是我們所要重點(diǎn)研究的。創(chuàng)建滿屏窗口、計(jì)時(shí)器,隱藏鼠標(biāo),展示圖片,響應(yīng)鍵盤、鼠標(biāo)等等,這家伙全包了。至于MyScreensaverDlg.h與MyScreensaverDlg.cpp文件我們暫時(shí)不管。打開MyScreensaver.cpp,修改InitInstance()函數(shù):

BOOL CMyScreensaverApp::InitInstance()

{

AfxEnableControlContainer();

#ifdef _AFXDLL

Enable3dControls(); // Call this when using MFC in a shared DLL

#else

Enable3dControlsStatic(); // Call this when linking to MFC statically

#endif

CMyWnd* pWnd = new CMyWnd;

pWnd-Create();

m_pMainWnd = pWnd;

return TRUE;

}

當(dāng)然,再這之前得先 #include “MyWnd.h" 。后面要做的都在MyWnd.h 與 MyWnd.cpp 兩文件中了。

下面給出CMyWnd 的說明:

class CMyWnd : public CWnd

{

public:

CMyWnd();

static LPCSTR lpszClassName; //注冊類名

public:

BOOL Create();

public:

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CMyWnd)

protected:

virtual void PostNcDestroy();

//}}AFX_VIRTUAL

public:

virtual ~CMyWnd();

protected:

CPoint m_prePoint; //檢測鼠標(biāo)移動

void DrawBitmap(CDC& dc, int nIndexBit);

//{{AFX_MSG(CMyWnd)

afx_msg void OnPaint();

afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);

afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

afx_msg void OnMButtonDown(UINT nFlags, CPoint point);

afx_msg void OnMouseMove(UINT nFlags, CPoint point);

afx_msg void OnRButtonDown(UINT nFlags, CPoint point);

afx_msg void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);

afx_msg void OnDestroy();

afx_msg void OnTimer(UINT nIDEvent);

afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);

afx_msg void OnActivateApp(BOOL bActive, HTASK hTask);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

MyWnd.cpp 文件:

……

CMyWnd::CMyWnd()

{

m_prePoint=CPoint(-1, -1);

}

LPCSTR CMyWnd::lpszClassName=NULL;

BOOL CMyWnd::Create()

{

if(lpszClassName==NULL)

{

lpszClassName=AfxRegisterWndClass(CS_HREDRAW CS_VREDRAW,

::LoadCursor(AfxGetResourceHandle(),MAKEINTRESOURCE(IDC_NOCURSOR)));

//注冊類;IDC_NOCURSOR為新建光標(biāo)的ID,這個光標(biāo)沒有任何圖案

}

CRect rect(0, 0, ::GetSystemMetrics(SM_CXSCREEN),

::GetSystemMetrics(SM_CYSCREEN));

CreateEx(WS_EX_TOPMOST, lpszClassName, _T(“”), WS_VISIBLE WS_POPUP,

rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,

GetSafeHwnd(), NULL, NULL); //創(chuàng)建一個全屏窗口

SetTimer(ID_TIMER, 500, NULL);//計(jì)時(shí)器,ID_TIMER別忘了定義

return TRUE;

}

為了防止同時(shí)運(yùn)行兩個相同的程序,下面兩個函數(shù)是必需的:

void CMyWnd::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)

{

CWnd::OnActivate(nState,pWndOther,bMinimized);

if (nState==WA_INACTIVE)

PostMessage(WM_CLOSE);

}

void CMyWnd::OnActivateApp(BOOL bActive, HTASK hTask)

{

CWnd::OnActivateApp(bActive, hTask);

if (!bActive) //is being deactivated

PostMessage(WM_CLOSE);

}

OnPaint()函數(shù)將全屏窗口置為黑色:

void CMyWnd::OnPaint()

{

CPaintDC dc(this);

CBrush brush(RGB(0,0,0));

CRect rect;

GetClientRect(rect);

dc.FillRect(&rect, &brush);

}

由計(jì)數(shù)器調(diào)用DrawBitmap()函數(shù),切換圖片;注意,下面兩個函數(shù)中的IDB_BITMAP1, dc.BitBlt(0,0,800,600……以及if(nIndexBit=5)中的有關(guān)數(shù)據(jù)依據(jù)你的bmp圖片個數(shù)、尺寸、位置不同而不同,我是選擇了5張800x600的bmp圖片。注意,ID值是連續(xù)的,IDB_BITMAP1最小。

void CMyWnd::DrawBitmap(CDC &dc, int nIndexBit)

{

CDC dcmem;

dcmem.CreateCompatibleDC(&dc);

CBitmap m_Bitmap;

m_Bitmap.LoadBitmap(IDB_BITMAP1+nIndexBit);

dcmem.SelectObject(m_Bitmap);

dc.BitBlt(0,0,800,600,&dcmem,0,0,SRCCOPY);

}

void CMyWnd::OnTimer(UINT nIDEvent)

{

CClientDC dc(this);

static nIndexBit=0;

if(nIndexBit=5)

nIndexBit=0;

DrawBitmap(dc, nIndexBit++);

CWnd::OnTimer(nIDEvent);

}

響應(yīng)鍵盤、鼠標(biāo)是屏幕保護(hù)程序不可缺少的,在OnKeyDown()、 OnLButtonDown()、 OnMButtonDown()、OnRButtonDown()、OnSysKeyDown()函數(shù)中都加入:

PostMessage(WM_CLOSE);

OnMouseMove()函數(shù)比較特殊,它應(yīng)加的代碼為:

if(m_prePoint == CPoint(-1,-1))

m_prePoint = point;

else if(m_prePoint!=point)

PostMessage(WM_CLOSE);

快要完工了。在OnDestroy()函數(shù)中刪掉計(jì)時(shí)器:KillTimer(ID_TIMER);

還有啦,在CMyWnd::PostNcDestroy() 中加入: delete this;

哎呀,腰酸背疼,眼球發(fā)澀,手背奇麻(不會吧)!不過,相信你一定會迫不及待地按下Ctrl+F5, 看著一幅幅圖片在你面前輪番展示,啊,自己的屏幕保護(hù)程序!趕快趕快,換上自制的屏保,感覺就是不一樣:圖片任你挑,時(shí)間間隔任你改,鼠標(biāo)?鍵盤?我想響應(yīng)誰就響應(yīng)誰……哎呀,誰扔的紙團(tuán):(。

其實(shí),上面的程序還有很多可以改進(jìn)的地方,比如圖片總是單一地顯示;bmp 文件太大,導(dǎo)致生成的屏幕保護(hù)程序也很大,遠(yuǎn)沒有jpg合算;沒有密碼,沒有可直接控制的界面。由于InitInstance()函數(shù)的簡單處理(直接調(diào)用CMyWnd類),你會發(fā)現(xiàn)當(dāng)你在桌面上右擊,選擇“屬性”、“屏幕保護(hù)程序”頁、“屏幕保護(hù)程序”下拉菜單、選中MyScreensaver時(shí),MyScreensaver就直接預(yù)覽了(或是直接運(yùn)行了);假設(shè)你確定MyScreensaver作為你的屏幕保護(hù)程序,等你第二次進(jìn)入“屏幕保護(hù)程序”頁時(shí),就直接預(yù)覽。Why? 回頭看看InitInstance()函數(shù)就明白了。為了讓它更聽話地工作,可修改InitInstance()函數(shù):

LPTSTR lpszArgv = __argv[1];

if (lpszArgv[0] ==‘/’)

lpszArgv++;

if (lstrcmpi(lpszArgv, _T(“s”))==0)

{

CMyWnd* pWnd=new CMyWnd;

pWnd-Create();

m_pMainWnd=pWnd;

return TRUE;

}

return FALSE;

不過現(xiàn)在你要是再在VC中運(yùn)行這個程序,“該程序執(zhí)行了非法操作,即將關(guān)閉。將會伴隨著一超重低音供你欣賞。(啊?)原因是我們加了一句return FALSE; 還有,別忘了還有一個CMyScreensaverDlg類沒有用上,用它來與你的屏保直接對話再好不過了。例如,為了方便地確定時(shí)間間隔,選取圖片,加上一個編輯框和幾個按鈕就可以了。重申一點(diǎn),由于生成文件較大,占用的內(nèi)存也多,如果不能運(yùn)行,很可能是開的窗口太多了。這時(shí)你可以換較小的圖片。


網(wǎng)站欄目:vb.Net作屏幕保護(hù) vbs鎖屏
標(biāo)題鏈接:http://weahome.cn/article/ddgocjg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部