Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Devil
Anmeldungsdatum: 21.12.2005 Beiträge: 2
|
Verfasst am: 21.12.2005, 08:18 Titel: angezeigten text in Zwischenablage kopieren |
|
|
hi, nachdem ich im forum nicht fündig geworden bin will ichs mal so versuchen. bin noch totaler anfänger.
ich möchte gern folgendes erreichen:
Beispiel: user print A Text soundso wird angezeigt. OK das hab ich schon hinbekommen .
was ich nicht weiss ist wie ich das problem lösen kann
user print 1 kopier den angezeigten text in zwischenablage, so das ich ihn einfach mit strg-V in einem anderen programm einfügen kann.
ich hoffe ich hab mich nicht zu unklar ausgedrückt und mit der frage nicht allzu grosse lachflashs ausgelöst  |
|
Nach oben |
|
 |
PeterHarder

Anmeldungsdatum: 27.03.2005 Beiträge: 45 Wohnort: Deutschland
|
Verfasst am: 22.12.2005, 00:25 Titel: |
|
|
Hier ist mal die Procedure "SetClipboardText()" und die Function "GetClipboardText", so wie ich sie in GFA-Basic verwende. Dürfte kein Problem sein, die nach FreeBasic anzupassen (% ist in GFA-Basic 4-Byte, Procedure(...)=Sub(ByVal ...)).
Code: | Procedure SetClipboardText(txt$)
Local lpMem%, hGlobalClip%
' GLOBAL hGlobalClip%
hGlobalClip% = GlobalAlloc(GMEM_MOVEABLE Or GMEM_SHARE, Len(txt$) + 1)
If txt$ <> "" And hGlobalClip% <> 0
If GlobalSize(hGlobalClip%) > 0
If OpenClipboard(0)
~EmptyClipboard()
txt$ = Left$(txt$, GlobalSize(hGlobalClip%) - 1) ' String kappen, falls zu lang
txt$ = txt$ + Chr$(0)
lpMem% = GlobalLock(hGlobalClip%)
MemBFill lpMem%, GlobalSize(hGlobalClip%), 0 ' Alles mit Nullbytes auffüllen
~lstrcpy(lpMem%, V:txt$)
~GlobalUnlock(hGlobalClip%)
~SetClipboardData(CF_TEXT, hGlobalClip%)
~CloseClipboard()
EndIf
EndIf
EndIf
~GlobalFree(hGlobalClip%)
Return
Function GetClipboardText$()
Local txt$, hGlobal%, lpMem%
If OpenClipboard(0)
hGlobal% = GetClipboardData(CF_TEXT)
If hGlobal% <> 0
lpMem% = GlobalLock(hGlobal%)
If lpMem% > 0
txt$ = String$(lstrlen(lpMem%), " ")
If txt$ <> ""
~lstrcpy(V:txt$, lpMem%)
EndIf
EndIf
lpMem% = GlobalUnlock(hGlobal%)
EndIf
~CloseClipboard()
EndIf
Return txt$
EndFunc |
Eigentlich gehöft das ja nach "WinApi" rein, oder?
Frohe Weihnachten!
Gruß, Peter _________________ Deutsche Mailingliste für freeBASIC: de.groups.yahoo.com/group/free-basic.
Zum Anmelden einfach eine leere E-Mail an free-basic-subscribe@yahoogroups.de senden. |
|
Nach oben |
|
 |
Devil
Anmeldungsdatum: 21.12.2005 Beiträge: 2
|
Verfasst am: 22.12.2005, 07:36 Titel: |
|
|
danke für deine mühe nur wie ich oben schon sagte ich bin ANFÄNGER und hab so meine schwierigkeiten damit sowas umzusetzen.ich dachte das das irgendwie einfacher geht.
dir auch frohe weihnachten |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 22.12.2005, 19:20 Titel: |
|
|
@PeterHarder
Von Einfach kann nicht die Rede sein ...
Scheinbar benötigt man noch die WinApi Definition, und die machen immer wieder Probleme ...
Bei Freebasic ist die WinApi schlecht intergriert, weil Freebasic Multiplatform ist. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Dominik
Anmeldungsdatum: 22.12.2004 Beiträge: 172
|
Verfasst am: 31.12.2005, 18:26 Titel: |
|
|
Hallo,
ich habe leider auch nur C++-Code zu bieten, aber der ist wesentlich einfacher....
Zwischenablage leeren und mit Text füllen:
Code: |
hGlobal = GlobalAlloc (GHND | GMEM_SHARE, iLenght + 1);
pGlobal = Globalock (hGlobal);
for (i = 0 ; i < iLinght ; i++)
*pGlobal++ = *pString++;
GlobalUnlock (hGlobal) ;
//hGlobal ist nun ein Handle zu dem String der in die Zwischenablage
//kopiert werden soll.
//Nun folgt öffnen und leeren der Zwischenablage.
OpenClipboard (hwnd) ;
EmptyClipboard () ;
//Jetzt noch Text in die Zwischenablage setzen.
SetClipboardData (CF_TEXT, hGlobal) ;
//Schließen der Zwischenablage (wichtig!, lässt andere Programme
//wieder auf die Zwischenablage zugreifen).
CloseClipboard() ;
|
Hoffe, es hat dir etwas geholfen. Die meisten Befehle laufen über die WinApi, d.h. dieser Code dürfte ziemlich einfach zu portieren sein. |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 31.12.2005, 23:24 Titel: |
|
|
Haha, WinApi ...
Als Standart Quelle für API Geschichten benutze ich http://www.vbarchiv.net/ und dort gibt es keinen Befehl OpenClipboard (hwnd) und auch nicht EmptyClipboard ().
Offen gesagt ist der C++ Code von dir nichts Wert, es fehlen alle Definitionen, die bei C++ einen viel höhren Stellwert einnehmen als in Basic ...
Wahrscheinlich ist er so einfach weil der wichtigste Teil des Codes nicht da ist ... _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Dominik
Anmeldungsdatum: 22.12.2004 Beiträge: 172
|
Verfasst am: 02.01.2006, 14:43 Titel: Sorry, aber die gibt es doch! |
|
|
Ich muss es leider wagen dich zu korrigieren, Michael Frey.
Auf Win32.hlp und ein Buch von Microsoft Press stützend behaupte ich, dass es alle genannten Funktionen gibt. Einzig und allein habe ich die Deklaration der Variablen weggelassen, weil FreeBasic andere Typen verwendet und stattdessen Präfixe (hGlobal = Globales Handle also in FreeBasic LONG und in C++ HGLOBAL und pGlobal ist in C++ PTSTR) verwendet.
Da Devil nach Code für FreeBASIC sucht und nicht nach C++ Code und er außerdem sagte er seie Anfänger dachte ich, ich mache es ihm damit einfacher.
Aber okay, war vielleicht keine so gute Idee. Hiermit hole ich das nach:
Code: |
HGLOBAL hGlobal;
PTSTR pGlobal;
int i;
int iLenght; //Anzahl der zu kopierenden Zeichen.
hGlobal = GlobalAlloc (GHND | GMEM_SHARE, iLenght + 1);
pGlobal = Globalock (hGlobal);
for (i = 0 ; i < iLinght ; i++)
*pGlobal++ = *pString++;
GlobalUnlock (hGlobal) ;
//hGlobal ist nun ein Handle zu dem String der in die Zwischenablage
//kopiert werden soll.
//Nun folgt öffnen und leeren der Zwischenablage.
OpenClipboard (hwnd) ;
EmptyClipboard () ;
//Jetzt noch Text in die Zwischenablage setzen.
SetClipboardData (CF_TEXT, hGlobal) ;
//Schließen der Zwischenablage (wichtig!, lässt andere Programme
//wieder auf die Zwischenablage zugreifen).
CloseClipboard()
|
[edit]
Mir fällt außerdem gerade auf, dass Peter Harder ein paar Beiträge weiter oben auch OpenClipboard und sogar EmptyClipboard verwendet.  |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 02.01.2006, 15:18 Titel: |
|
|
Haha, und wo sind die Biblothek Deklartionen?
Die die etwa so aussehen:
Dein "Einfacher machen" nacht nur Probleme, einen Völlstandigen C++ Code zu übersetzen ist mühsam genug, aber solcher Code, bei dem die Hälfte fehlt ist ganz unmöglich!
Zudem: Ich hab mir die Datei "win32.hlp" aus dem Netzgezogen:
Ist dir Aufgefallen das das Ding "Win32 SDK Reference" heisst und nicht WinAPI?
Wenigstens hab ich jetzt einige einiger brauchbare Info's aus dieser Datei "win32.hlp" entnehmen können ...
 _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 02.01.2006, 16:02 Titel: |
|
|
Ich veröffentliche mal was ich geschaft habe:
Code: | Declare Function CloseClipboard Lib "user32" alias "CloseClipboard" () As Integer
Declare Function EmptyClipboard Lib "user32" alias "EmptyClipboard" () As Integer
Declare Function OpenClipboard Lib "user32" Alias "OpenClipboard" (ByVal hwnd As Integer) As Integer
OpenClipboard (0)
EmptyClipboard ()
CloseClipboard() |
Immerhin, kann man schon mal das Clipboard löschen ... _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 02.01.2006, 17:05 Titel: |
|
|
Ich hab's :
Code: | #define CF_TEXT 1
#define GMEM_MOVEABLE &H2
#define GMEM_SHARE &H2000
Declare Function GlobalSize Lib "kernel32" Alias "GlobalSize" (ByVal hMem As Integer) As Integer
Declare Function GlobalHandle Lib "kernel32" Alias "GlobalHandle" ( ByRef wMem As ANY) As Integer
Declare Function GlobalUnlock Lib "kernel32" Alias "GlobalUnlock" (ByVal hMem As Integer) As Integer
Declare Function GlobalLock Lib "kernel32" Alias "GlobalLock" (ByVal hMem As Integer) As Integer
Declare Function GlobalAlloc Lib "kernel32" Alias "GlobalAlloc" (ByVal wFlags As Integer, ByVal dwBytes As Integer) As Integer
Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As integer, ByVal lpString2 As String) As Integer
Declare Function CloseClipboard Lib "user32" alias "CloseClipboard" () As Integer
Declare Function EmptyClipboard Lib "user32" alias "EmptyClipboard" () As Integer
Declare Function SetClipboardData Lib "user32" alias "SetClipboardData" (ByVal wFormat As Integer, ByVal hMem As Integer) As Integer
Declare Function OpenClipboard Lib "user32" Alias "OpenClipboard" (ByVal hwnd As Integer) As Integer
dim txt as zstring*20
Dim poin AS INTEGER PTR
? "Was soll in's Clipboard?"
input txt
hGlobalClip = GlobalAlloc(GMEM_MOVEABLE Or GMEM_SHARE, 20)
OpenClipboard (0)
EmptyClipboard ()
lpMem=GlobalLock(hGlobalClip)
lstrcpy(lpMem, txt$)
GlobalUnlock(lpMem)
SetClipboardData (CF_TEXT, hGlobalClip)
CloseClipboard()
sleep |
Oder auch http://fb.exp-soft.de/fbnp/index.php?view=138
Danke Dominik und vorrallem PeterHarder euer Code hat geholfen!
Zur Info:
Die Maximale länge des String ist 20 Zeichen, aber das lässt sich ohne grössere Probleme ändern. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 02.01.2006, 17:41 Titel: |
|
|
Hallo.
Wie kann man Bilder aus dem Clipboard laden? Bei Text habe ich kein Problem damit, aber bei Bildern gehts irgendwie nicht. Bei VB Codes habe ich imemr was von hdc(gerätekontext oder so ) gelesen, weiß aber nciht wie man damit ein Bild aus der zwischenablage in ein array oder eine Datei laden kann. Würde mich sehr freuen, wenn das einer schafft.
Michael _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
|
Nach oben |
|
 |
Dominik
Anmeldungsdatum: 22.12.2004 Beiträge: 172
|
Verfasst am: 02.01.2006, 18:45 Titel: |
|
|
Den folgenden Code zum Laden von Text aus der Zwischenablage habe ich in meinem Buch zur Windowsprogrammierung gefunden:
Code: |
#include <windows.h>
PTSTR pText;
HGLOBAL hGlobal;
OpenClipboard(hwnd);
if (hGlobal = GetClipboardData (CF_TCHAR))
{
pGlobal = GlobalLock (hGlobal) ;
pText = malloc (GlobalSize (hGlobal)) ;
lstrcpy (pText, pGlobal) ; //Nun enthält pText den Text der Zwischenablage.
CloseClipboard ();
}
|
Ich werde versuchen ihn heute Abend noch in Basic übersetzen, stelle ihn aber trozdem mal in C++ online, vielleicht ist jemand schneller  |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 02.01.2006, 19:49 Titel: |
|
|
Etwas Pfusch, aber es geht:
Code: | #define CF_TEXT 1
#define GMEM_MOVEABLE &H2
#define GMEM_SHARE &H2000
Declare Function GlobalSize Lib "kernel32" Alias "GlobalSize" (ByVal hMem As Integer) As Integer
Declare Function GlobalHandle Lib "kernel32" Alias "GlobalHandle" ( ByRef wMem As ANY) As Integer
Declare Function GlobalUnlock Lib "kernel32" Alias "GlobalUnlock" (ByVal hMem As Integer) As Integer
Declare Function GlobalLock Lib "kernel32" Alias "GlobalLock" (ByVal hMem As Integer) As Integer
Declare Function GlobalAlloc Lib "kernel32" Alias "GlobalAlloc" (ByVal wFlags As Integer, ByVal dwBytes As Integer) As Integer
Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As string, ByVal lpString2 As integer) As Integer
Declare Function CloseClipboard Lib "user32" alias "CloseClipboard" () As Integer
Declare Function EmptyClipboard Lib "user32" alias "EmptyClipboard" () As Integer
Declare Function SetClipboardData Lib "user32" alias "SetClipboardData" (ByVal wFormat As Integer, ByVal hMem As Integer) As Integer
Declare Function OpenClipboard Lib "user32" Alias "OpenClipboard" (ByVal hwnd As Integer) As Integer
Declare Function GetClipboardData Lib "user32" Alias "GetClipboardData" (ByVal wFormat As Integer) As Integer
dim txt as zstring*20
txt=" "
? OpenClipboard(0)
'hGlobal = GlobalAlloc(GMEM_MOVEABLE Or GMEM_SHARE, 30)
hGlobal = GetClipboardData(1)
? hGlobal
if hGlobal then
pGlobal = GlobalLock(hGlobal)
? lstrcpy (txt, pGlobal)
? CloseClipboard ()
end if
? txt
sleep |
_________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 02.01.2006, 23:57 Titel: |
|
|
Hallo.
Irgendwei aknn man vor dem auslesen schon sehen, wie lang das ist, ich hatte das vor ein paar tagen, habe den code aber übreschrieben, mal gucken, ob ich es schaffe.
Das Bilderauslesen schaffe ich nicht, auch nicht mit den tipps, da da immer was mit hdc etc. gemacht werden muss, wie man dass dann nacher in ein fb kompatibles format bekommt weiß ich nicht.
MIchael _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
oldirty

Anmeldungsdatum: 04.08.2005 Beiträge: 65
|
Verfasst am: 03.01.2006, 19:10 Titel: Habe nur VisualBasic-Codes zum o. g. Thema gefunden |
|
|
VisualBasic-Code, der auch die Länge des Textes ermittelt: Zeile: lLength = lstrlen(hStrPtr)
Code: |
Private Const CF_TEXT = 1
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Long, ByVal ByteLen As Long)
Private Sub Form_Load()
'KPD-Team 2001
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
Dim hStrPtr As Long, lLength As Long, sBuffer As String
OpenClipboard Me.hwnd
hStrPtr = GetClipboardData(CF_TEXT)
If hStrPtr <> 0 Then
lLength = lstrlen(hStrPtr)
If lLength > 0 Then
sBuffer = Space$(lLength)
CopyMemory ByVal sBuffer, ByVal hStrPtr, lLength
MsgBox sBuffer, vbInformation
End If
End If
CloseClipboard
End Sub
|
Hier VisualBasic-Code, der Bitmaps bereitsstellt, kann leider keine FreeBasic-Version liefern.
Vielleicht findet sich ja jemand, der den Code konvertiert.
Code: |
Const LR_LOADFROMFILE = &H10
Const IMAGE_BITMAP = 0
Const IMAGE_ICON = 1
Const IMAGE_CURSOR = 2
Const IMAGE_ENHMETAFILE = 3
Const CF_BITMAP = 2
Private Declare Function LoadImage Lib "user32" Alias "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, ByVal dwImageType As Long, ByVal dwDesiredWidth As Long, ByVal dwDesiredHeight As Long, ByVal dwFlags As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
Private Sub Form_Load()
'KPD-Team 1999
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
Dim hDC As Long, hBitmap As Long
'Load the bitmap into the memory
hBitmap = LoadImage(App.hInstance, "c:\windows\logow.sys", IMAGE_BITMAP, 320, 200, LR_LOADFROMFILE)
If hBitmap = 0 Then
MsgBox "There was an error while loading the bitmap"
Exit Sub
End If
'open the clipboard
OpenClipboard Me.hwnd
'Clear the clipboard
EmptyClipboard
'Put our bitmap onto the clipboard
SetClipboardData CF_BITMAP, hBitmap
'Check if there's a bitmap on the clipboard
If IsClipboardFormatAvailable(CF_BITMAP) = 0 Then
MsgBox "There was an error while pasting the bitmap to the clipboard!"
End If
'Close the clipboard
CloseClipboard
'Get the picture from the clipboard
Me.Picture = Clipboard.GetData(vbCFBitmap)
End Sub
|
|
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 03.01.2006, 20:42 Titel: |
|
|
Hallo.
Erstmal danke für den Code, obwohl ich ja eigentlich auslesen wollte. Wenn ich das schreiben schaffe, wird das jedoch kein Problem mehr sein(denke ich). Danke.
Michael _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
|