GetClipboardData siempre devuelve NULL [cerrado]

0

Tengo el siguiente código:

Public Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Public Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function CloseClipboard Lib "user32" () As Long

Sub test()
Dim wat As String

OpenClipboard (0&)
wat = GetClipboardData(CF_TEXT)
MsgBox wat
CloseClipboard

End Sub

Esto siempre devuelve 0 (NULL) en el msgbox. ¿Podría alguien decirme qué está mal con este código?

Noir
fuente
Supongo que el problema es su llamada a OpenClipboard, ¿qué valor booleano devuelve? Edita tu pregunta para incluir esta información vital
Ramhound
@Ramhound ¿cómo lo sabría (en el sentido de cómo lo verifico)?
Noir
La misma forma en que verificó que el otro método devolvía 0. Use una variable para capturar el valor de retorno.
Ramhound
@Ramhound no parece ser el día más brillante para mí. De hecho puedo confirmar que el booleano es 1.
Noir
@Ramhound Creo que el código realmente funciona, simplemente no devuelve lo que esperaba. Si el portapapeles está vacío, devuelve 0, si no está vacío, devuelve un número aparentemente aleatorio de enteros (por ejemplo, "*" devuelve 791549112). Hubiera esperado que devuelva el texto copiado real.
Noir

Respuestas:

1

GetClipboardData entregará un identificador al bloque de memoria global. Tendrás que bloquear este bloque y recuperar el String desde allí.

Residencia en ventanas-api / recuperación-información-del-portapapeles Un ejemplo rápido y sucio basado en tu pregunta:

Public Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Public Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function CloseClipboard Lib "user32" () As Long
Public Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Public Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Public Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
Public Const CF_TEXT = 1
Public Const MAXSIZE = 4096






Sub test()
Dim wat As String
Dim hClipMemory As Long
Dim lpClipMemory As Long
Dim Dummy As Long
If OpenClipboard(0&) <> 0 Then    
  hClipMemory = GetClipboardData(CF_TEXT)
  If Not IsNull(hClipMemory) Then
    lpClipMemory = GlobalLock(hClipMemory)
    If Not IsNull(lpClipMemory) Then
        wat = Space$(MAXSIZE)
        Dummy = lstrcpy(wat, lpClipMemory)
        GlobalUnlock (hClipMemory)
    End If
  End If      
  MsgBox wat
CloseClipboard
End If

End Sub
bummi
fuente
Gracias @bummi. Soy muy nuevo en llamar a las bibliotecas de user32 y kernel32, por lo que parece que no entendí cómo debería haberse ejecutado este código. Te otorgué la solución, ya que lo que publicaste realmente hace lo que yo hubiera querido que hiciera. Y gracias por el enlace, examinaré el código completo y la documentación para comprender mejor lo que realmente está sucediendo.
Noir