如題,因為我在截圖的時候并不會把這個東西截圖進去,有什么方法?如果有更高級的方法指明一下,不要外掛dll和第三方庫,就是直接在螢屏上畫一張照片(居中,而且這張圖片就是截的圖),然后再次截圖的時候,把畫出來的和原先的桌面,其所有視窗也一起截上(就是人眼看到的),因為我在使用標題上面的那個方法時,畫的速度太慢,而且經常會死機,請各位高手幫忙一下。

最好貼一下代碼。
uj5u.com熱心網友回復:
如果使用和題目一樣的方法,只會反復截沒有那個圖片的桌面,最終結果還是一張桌面
uj5u.com熱心網友回復:
我也想知道Graphics畫在螢屏上的影像,這個能發下看下么
uj5u.com熱心網友回復:
Sorry,我也想,但是我覺得應該是句柄的問題了
uj5u.com熱心網友回復:
不知道行不行Dim slp As Double = 1000 '決定休眠時間。
Dim temp1 As Screen = My.Computer.Screen
Dim a As New Bitmap(temp1.WorkingArea.Size.Width, temp1.WorkingArea.Size.Height)
Dim aaa As Graphics = Graphics.FromHdc(GetWindowDC(GetDesktopWindow()))
Dim aaab As Graphics = Graphics.FromImage(a)
Dim sa As New Point(0, 0)
Do
Try
slp -= 0.5
If slp <= 0 Then
slp = 1
End If
aaab.FastCopySreen()
Dim Hicon As IntPtr = a.GetHicon()
aaa.DrawIcon(Icon.FromHandle(Hicon), New Rectangle With {
.Width = temp1.WorkingArea.Width * 0.9,
.Height = temp1.WorkingArea.Height * 0.9,
.X = temp1.WorkingArea.Width * 0.05,
.Y = temp1.WorkingArea.Height * 0.05
})
Threading.Thread.Sleep(slp)
aaab.Dispose()
a.Dispose()
a = New Bitmap(temp1.WorkingArea.Size.Width, temp1.WorkingArea.Size.Height)
aaab = Graphics.FromImage(a)
Catch
aaa.Dispose()
aaab.Dispose()
a.Dispose()
Threading.Thread.Sleep(10000)
GoTo To2DWorld
End Try
Loop
uj5u.com熱心網友回復:
FastCopySreen 是什么鬼uj5u.com熱心網友回復:
個.net呼叫dll[win32]中非常奇怪的問題dll是用Delphi7.0寫的一個COM組件。用VB.NET呼叫是出現了堆損壞的例外。但能回傳正確的結果。
代碼如下
procedure TMyComObj.GetText(Dir,FileNameCol : PWideChar);
var s : string;
ss : Widestring;
i ,Len : integer;
p : ^Widestring;
begin
s := XXXXX(Dir); //XXXXX是個回傳字串的函式
ss := s;
Len := length(ss);
p := Pointer(FileNameCol);
for i :=1 to Len do
begin
p^ := ss[i];
Inc(p)
end;
end;
在VB.NET先給FileNameCol預分配了一兆空間
做了如下處理
FileNameCol=“aa”
for i=1 to 19
FileNameCol=FileNameCol & FileNameCol
next
在VB中呼叫這個MyComObj.GetText方法時出現了“堆損壞”的例外,但FileNameCol取回的值是正確的。
但是在COM組件作如下改進就不會出現這個例外
首先在這個介面實作類中定義一個 Private Ps : ^Widestring;
然后在介面中加入如下兩個方法
ALLocaMemory(Len : LongWord)
FreeMeMory(Len : LongWord)
實作代碼如下
procedure TMyComObj.ALLocaMemory(Len : LongWord);
begin
Ps :=ALLocMem(2*Len)
end;
procedure TMyComObj.FreeMemory(Len : LongWord);
begin
FreeMem(Ps,2*Len)
end;
對 GetText(Dir,FileNameCol : PWideChar)方法作如下修改:
procedure TMyComObj.GetText(Dir,FileNameCol : PWideChar);
var s : string;
ss : Widestring;
i ,Len : integer;
p,pa,pb : ^Widestring;
begin
s := XXXXX(Dir); //XXXXX是個回傳字串的函式
ss := s;
Len := length(ss);
p := Pointer(FileNameCol);
pa := Pointer(Ps);
pb := pa;
//下面這段代碼是將ss逐字符寫到Ps指向的記憶體塊中(通過ALLocaMemory為Ps分配記憶體)
for i :=1 to Len do
begin
pa^ := ss[i];
Inc(pa)
end;
//下面這段代碼是將Ps指向的記憶體塊中內容復制到FileNameCol
for i :=1 to Len do
begin
p^ := pb^;
Inc(pb);
Inc(pb);
end;
end;
在VB.NET先呼叫ALLocaMemory,然后呼叫GetText,最后呼叫FreeMemory。
能回傳正確字串,且不出現例外。
對此問題我百思不得其解,因此請教高手解答
uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/117616.html
標籤:VB.NET
下一篇:求助c#編程
