PDA

View Full Version : مبتدی: کپی چیزی غیر از رشته در clipboard



mr-adler
چهارشنبه 16 آذر 1390, 12:34 عصر
سلام
سوالمو تو عنوان تاپیک پرسیدم.ممنون میشم راهنمایی کنید.
میدونم که با متد های getdata و setdata هست.یه نمونه ساده همه چیزو حل میکنه.
مثلا میخوام یه فایل رو تو کلیپبورد کپی کنم....

Restlesa
چهارشنبه 16 آذر 1390, 12:51 عصر
تنها راه حل استفاده از توابع Api هستش که نمونه های مشابه اش هم در سایت وجود داره

mr-adler
چهارشنبه 16 آذر 1390, 13:47 عصر
سلام
ممنون که جواب دادید:
بدون api هم میشه اما چجوریش رو نمیدونم.متد های setdata مربوط به کپی کردنه به نظرم اما نمیدونم چطور . ادرس قبول نمیکنه.
راستی به وسیله api اگه بخوام این کارو انجام بدم چه کلمه ای رو باید در تالار جستجو کنم؟

ممنونم

_behnam_
چهارشنبه 16 آذر 1390, 22:52 عصر
سلام!
کد زیر ای کارو میکنه با استفاده از API



Option Explicit

' Required data structures
Private Type POINTAPI
X As Long
y As Long
End Type

' Clipboard Manager Functions
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long

' Other required Win32 APIs
Private Declare Function DragQueryFile Lib "shell32.dll" Alias "DragQueryFileA" (ByVal hDrop As Long, ByVal UINT As Long, ByVal lpStr As String, ByVal ch As Long) As Long
Private Declare Function DragQueryPoint Lib "shell32.dll" (ByVal hDrop As Long, lpPoint As POINTAPI) As Long
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

' Predefined Clipboard Formats
Private Const CF_TEXT = 1
Private Const CF_BITMAP = 2
Private Const CF_METAFILEPICT = 3
Private Const CF_SYLK = 4
Private Const CF_DIF = 5
Private Const CF_TIFF = 6
Private Const CF_OEMTEXT = 7
Private Const CF_DIB = 8
Private Const CF_PALETTE = 9
Private Const CF_PENDATA = 10
Private Const CF_RIFF = 11
Private Const CF_WAVE = 12
Private Const CF_UNICODETEXT = 13
Private Const CF_ENHMETAFILE = 14
Private Const CF_HDROP = 15
Private Const CF_LOCALE = 16
Private Const CF_MAX = 17

' New shell-oriented clipboard formats
Private Const CFSTR_SHELLIDLIST As String = "Shell IDList Array"
Private Const CFSTR_SHELLIDLISTOFFSET As String = "Shell Object Offsets"
Private Const CFSTR_NETRESOURCES As String = "Net Resource"
Private Const CFSTR_FILEDESCRIPTOR As String = "FileGroupDescriptor"
Private Const CFSTR_FILECONTENTS As String = "FileContents"
Private Const CFSTR_FILENAME As String = "FileName"
Private Const CFSTR_PRINTERGROUP As String = "PrinterFriendlyName"
Private Const CFSTR_FILENAMEMAP As String = "FileNameMap"

' Global Memory Flags
Private Const GMEM_FIXED = &H0
Private Const GMEM_MOVEABLE = &H2
Private Const GMEM_NOCOMPACT = &H10
Private Const GMEM_NODISCARD = &H20
Private Const GMEM_ZEROINIT = &H40
Private Const GMEM_MODIFY = &H80
Private Const GMEM_DISCARDABLE = &H100
Private Const GMEM_NOT_BANKED = &H1000
Private Const GMEM_SHARE = &H2000
Private Const GMEM_DDESHARE = &H2000
Private Const GMEM_NOTIFY = &H4000
Private Const GMEM_LOWER = GMEM_NOT_BANKED
Private Const GMEM_VALID_FLAGS = &H7F72
Private Const GMEM_INVALID_HANDLE = &H8000
Private Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT)
Private Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT)

Private Type DROPFILES
pFiles As Long
pt As POINTAPI
fNC As Long
fWide As Long
End Type


Public Function ClipboardCopyFiles(ByVal Files As String) As Boolean

Dim data As String
Dim df As DROPFILES
Dim hGlobal As Long
Dim lpGlobal As Long
Dim i As Long

' Open and clear existing crud off clipboard.
If OpenClipboard(0&) Then
Call EmptyClipboard

' Build double-null terminated list of files.

data = Files
' Allocate and get pointer to global memory,
' then copy file list to it.
hGlobal = GlobalAlloc(GHND, Len(df) + Len(data))
If hGlobal Then
lpGlobal = GlobalLock(hGlobal)

' Build DROPFILES structure in global memory.
df.pFiles = Len(df)
Call CopyMem(ByVal lpGlobal, df, Len(df))
Call CopyMem(ByVal (lpGlobal + Len(df)), ByVal data, Len(data))
Call GlobalUnlock(hGlobal)

' Copy data to clipboard, and return success.
If SetClipboardData(CF_HDROP, hGlobal) Then
ClipboardCopyFiles = True
End If
End If

' Clean up
Call CloseClipboard
End If

End Function

Public Function ClipboardPasteFiles(ByVal Files As String) As Long

Dim hDrop As Long
Dim nFiles As Long
Dim i As Long
Dim desc As String
Dim filename As String
Dim pt As POINTAPI
Const MAX_PATH As Long = 260

' Insure desired format is there, and open clipboard.
If IsClipboardFormatAvailable(CF_HDROP) Then
If OpenClipboard(0&) Then

' Get handle to Dropped Filelist data, and number of files.
hDrop = GetClipboardData(CF_HDROP)
nFiles = DragQueryFile(hDrop, -1&, "", 0)

' Allocate space for return and working variables.
ReDim Files(0 To nFiles - 1) As String
filename = Space(MAX_PATH)

' Retrieve each filename in Dropped Filelist.
For i = 0 To nFiles - 1
Call DragQueryFile(hDrop, i, filename, Len(filename))
Files(i) = TrimNull(filename)
Next

' Clean up
Call CloseClipboard
End If

' Assign return value equal to number of files dropped.
ClipboardPasteFiles = nFiles
End If

End Function

Private Function TrimNull(ByVal sTmp As String) As String

Dim nNul As Long

'
' Truncate input sTmpg at first Null.
' If no Nulls, perform ordinary Trim.
'
nNul = InStr(sTmp, vbNullChar)
Select Case nNul
Case Is > 1
TrimNull = Left(sTmp, nNul - 1)
Case 1
TrimNull = ""
Case 0
TrimNull = Trim(sTmp)
End Select
End Function

فراخوانی
Call ClipboardCopyFiles("C:\File.exe")

adib202
چهارشنبه 16 آذر 1390, 23:07 عصر
فكر كنم همينه كه مي خواي

mr-adler
چهارشنبه 16 آذر 1390, 23:39 عصر
سلام
خیلی ممنونم
پس این دو مورد چیکار میکنن؟
getdata و setdata
مگه به وسیله این دو نمیشه کپی و پیست کرد؟

M.T.P
پنج شنبه 17 آذر 1390, 09:50 صبح
برای کپی فایل در واقع آدرس فایل ها رو بصورت رشته تو clipboard ست می کنید.

mr-adler
پنج شنبه 17 آذر 1390, 16:32 عصر
سلام

برای کپی فایل در واقع آدرس فایل ها رو بصورت رشته تو clipboard ست می کنید.
به چه صورت؟متاسفانه رشته رو قبول نمیکنه.

Private Sub Command1_Click()
Clipboard.SetData ("d:\war.txt")
End Sub

M.T.P
پنج شنبه 17 آذر 1390, 17:10 عصر
کلیپ بورد خوراکش رشته ست :لبخند:
منتها باید از SetText استفاده کنید نه SetData .
SetData واسه عکسه

mr-adler
پنج شنبه 17 آذر 1390, 19:24 عصر
سلام

کلیپ بورد خوراکش رشته ست :لبخند:
:خجالت:

منتها باید از SetText استفاده کنید نه SetData .
SetData واسه عکسه
دو خط مثال میزنید؟ یک خط از کپی کردن عکس و یک خط هم از کپی کردن ادرس فایل:
باور کنید جواب نمیده:

Clipboard.SetText ("d:\war.txt")
راستی ارگومان دوم کلیپبورد به چه معنی است؟منظورم همون format هست.یادمه تو مطالب مربوط به ریسورس فرمت نشون میداد نوع تصویر چیه؟مثلا ایکن موسه یا تصویر bitmap و ....ولی اینجا نشون دهنده چیه؟؟؟؟

خیلی ممنونم.
فقط 2 تا مثال قرار شد بزنید و یه توضیح کوچیک راجع به ارگومان فرمت:خجالت::لبخند:

Restlesa
پنج شنبه 17 آذر 1390, 19:37 عصر
دوست عزیز با استفاده از دو دستور SetData و DGetData تنها می تونی یک رشته رو به Clipboard ارسال کنی ... نمونه ساده ای که می تونم برات مثال بزنم منوهای Cut , Copy , Paste برنامه Notepad ویندوز هستش
برای انقتقال سایر موارد به Clipboard باید از دستوراتی که دوستان در پست های 4 و 5 قرار دادن استفاده کنی

mr-adler
پنج شنبه 17 آذر 1390, 20:01 عصر
دوست عزیز با استفاده از دو دستور SetData و DGetData تنها می تونی یک رشته رو به Clipboard ارسال کنی ...
یعنی مثلا با قرار دادن ادرس فایل در کلیپبورد نمیشه فایلی را کپی کرد اقای M.T.P (http://barnamenevis.org/member.php?132020-M.T.P) گفتن که میشه...

برای کپی فایل در واقع آدرس فایل ها رو بصورت رشته تو clipboard ست می کنید.



نمونه ساده ای که می تونم برات مثال بزنم منوهای Cut , Copy , Paste برنامه Notepad ویندوز هستش
:متعجب:
منظورم از مثال این نیست. منظورم اینه که مثلا بگید این خط به این صورت کار میکنه:

Clipboard.Settext ("d:\war.txt")
(که در واقع این خط کار نمیکنه!)
برای مورد زیر مثالی ندارید؟

SetData واسه عکسه
در ضمن با مورد زیر مشکلی ندارم:

برای انقتقال سایر موارد به Clipboard باید از دستوراتی که دوستان در پست های 4 و 5 قرار دادن استفاده کنی

ممنونم:خجالت::قلب: