將圖示放到RichTextBox中并向其發送WM_COPY訊息后GDI增長,因為程式是批量執行,所以在數量達到一定值后程式會崩潰
請大神出手相助!!!!!
GDI查看可以通過Windows任務管理器,本代碼中已通過函式提取并顯示。代碼如下
控制元件加載Microsoft RichTextBox ,視窗加載控制元件 rtbThis,PictureBox1(Picture隨意賦值),TextBox1,Command1
Option Explicit
Private Const WM_USER = &H400 '通常用 WM_USER + X 來自定義訊息
Private Const EM_EXSETSEL = (WM_USER + 55) '選中一定范圍的字符或者OLE物件。
Private Type CHARRANGE
cpMin As Long
cpMax As Long
End Type
Private Const WM_CUT = &H300& '剪切
Private Const WM_COPY = &H301& '復制
Private Const WM_PASTE = &H302& '粘貼
Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetGuiResources Lib "User32.dll" (ByVal hProcess As Long, ByVal uiFlags As Integer) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private mlngPro As Long
Private mlngGdi As Long
Private Sub SetSelection(lHwnd As Long, ByVal lStart As Long, ByVal lEnd As Long)
Dim tCR As CHARRANGE
tCR.cpMin = lStart
tCR.cpMax = lEnd
SendMessage lHwnd, EM_EXSETSEL, 0, tCR
End Sub
Private Sub Command1_Click()
Dim lngGdi As Long
mlngGdi = GetGuiResources(mlngPro, 0)
rtbThis.Text = ""
Clipboard.SetData Picture1.Picture
SendMessageLong rtbThis.Hwnd, WM_PASTE, 0, 0
SetSelection rtbThis.Hwnd, 0, 1
SendMessageLong rtbThis.Hwnd, WM_COPY, 0, 0 '這句執行后增長
lngGdi = GetGuiResources(mlngPro, 0)
Text1.Text = Text1.Text & "當前GDI " & lngGdi & " 增長:" & lngGdi - mlngGdi & vbCrLf
Debug.Print "GDI增長:" & lngGdi - mlngGdi
End Sub
Private Sub Form_Load()
mlngPro = GetCurrentProcess
End Sub
uj5u.com熱心網友回復:
你用 Clipboard Viewer 工具查看,會發現 WM_COPY 中有物件。因為復制后 RechTextBox 的內容會變更,所以復制到剪貼板肯定需要克隆物件,而且沒法確定這個物件什么時候結束使用,只能一直持有了。因為剪貼板沒有提供通知釋放的機制,所以句柄只增不減。
你可以把整個表單Unload,這樣RickTextBox卸載時會把物件(句柄)釋放。
uj5u.com熱心網友回復:
老虎說的好像有道理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/93868.html
標籤:API
