Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Errore MsgBox

    Premetto che uso Visual Basic 2005,o comunque .Net
    Allora io ho un semplice form con un bottone,al click del bottone voglio che mi mostri una finestra di messaggio msgbox e muova il mouse sul pulsante ok del msgbox,un po' come succede in windows quando in 'pannello di controllo>mouse'si seleziona la casella di spunta "posiziona automaticamente sul pulsante predefinito in una finestra di dialogo".Posto il codice seguente,con cui ho tentato di farlo ma che mi ritorna errore

    codice:
     Public Structure RECT
            Dim Left As Long
            Dim Top As Long
            Dim Right As Long
            Dim Bottom As Long
        End Structure
        Private Declare Function GetClientRect Lib "user32" Alias "GetClientRect" (ByVal hwnd As Integer, ByVal lpRect As RECT) As Integer
        Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer
        Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            MsgBox("ciao", MsgBoxStyle.OkOnly, "ciccio")
            Dim twnd, bwnd As Integer
            Dim pt As RECT
            twnd = FindWindow(vbNullString, "ciccio")
            bwnd = FindWindowEx(twnd, 0&, "BUTTON", "OK")
            GetClientRect(bwnd, pt)
            Windows.Forms.Cursor.Position = New Point(pt.Left + ((pt.Right - pt.Left) / 2), pt.Top + ((pt.Bottom - pt.Top) / 2))
        End Sub

    Perché non mi funzia?
    Mi da un errore sull'API GetClientRect,dicendo che sbilancia lo stack
    Naturalmente sono aperto anche ad altre soluzioni,del tipo un modo alternativo di far posizionare il mouse sul pulsante predefinito.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    La MessageBox è una finestra modale, pertanto il tuo codice di spostamento del mouse verrà eseguito solamente quando la finestra sarà ormai chiusa.

    Nutro comunque dei dubbi sull'effettiva utilità di questa forzatura, se introdotta a livello di applicazione, s'intende.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    sì in effetti hai ragione,li nutro anch'io,ma per curiosità e adesso anche per puntiglio voglio imparare a farlo(beh,mi serve comunque in un'applicazione che sto realizzando).detto questo,ho pensato anch'io dipendesse dalla "modalità" della finestra,ma provando con un form(ossia al posto dell'istruzione msgbox un form.show con form.text="ciccio") mi dà lo stesso errore.
    Anche un form è modale?non mi pare(correggetemi se sbaglio),altrimenti non ci sarebbe la proprietà form.showdialog

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Hai provato ad eseguire il programma passo per passo per identificare l'istruzione che dà origine all'errore?

    In tal caso, dovresti introdurre anche codice in grado di gestirlo prima di passare dati ad una istruzione successiva.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    sì l'istruzione che dà l'errore è la seguente:

    GetClientRect(bwnd, pt)

    e mi dice:

    "Una chiamata alla funzione PInvoke 'WindowsApplication1!WindowsApplication1.Form1::Ge tClientRect' ha sbilanciato lo stack. Questo problema può verificarsi quando la firma PInvoke gestita non corrisponde alla firma di destinazione non gestita. Verificare che la convenzione di chiamata e i parametri della firma PInvoke corrispondano alla firma di destinazione non gestita."

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Sembra che la tua chiamata non sia corretta, cioé che la forma della funzione importata ed espressa con i tipi .NET non corrisponda a quella che ci si aspetterebbe per invocare la funzione API di riferimento.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7

    eh pare anche a me,ma non so come uscire dall'impasse.
    Ho provato anche a dichiarare la funzione GetCilentRect come Boolean,ho provato a sostituirla con GetWindowRect,niente,stesso risultato

  8. #8
    Io mi trovo lo stesso messaggio di errore utilizzando l' api GetAsyncKeyState, dato che non ho mai utilizzato le api in vb.net è possibile che sbaglio qualcosa:

    Public Class Form1

    Private Declare Ansi Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Short

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

    Dim result As Short
    'invio
    result = GetAsyncKeyState(Keys.Enter)
    If result < 0 Then
    MsgBox("Premuto invio")
    End If

    End Sub
    End Class

    jabjoint

  9. #9
    possibile che nessuno riesca ad aiutarmi?
    jabjoint

  10. #10
    Non ha senso rispondere ad una discussione vecchia di 5 mesi ponendo peraltro un quesito diverso... :rollo:
    Apri una nuova discussione.
    P.S.: un up dopo 50 minuti è un tantino eccessivo...
    P.P.S.: la dichiarazione della API è sbagliata. Al posto di Long devi mettere Integer.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.