21/04/11 17:54
Dyango
ciao ragazzi mentre riguardavo vecchi progetti in vb6 ho trovato una funzione con le stesse funzionalità del DoeEvents ma piu veloce, cosi per provare se davvero funzionasse ho tradotto il codice in vb.net:
quando vado per provarlo mi esce il seguente errore alla riga: TranslateMessage(CurrMsg)
errore: System.AccessViolationException
Message= Tentativo di lettura o scrittura della memoria protetta. Spesso questa condizione indica che altre parti della memoria sono danneggiate.
P.S: Codice corretto e funzionante
Private Structure POINTAPI Dim x As Integer Dim y As Integer End Structure Private Structure MSG Dim hwnd As Integer ' hwnd della finestra di destinazione del messaggio Dim message As Integer 'numero che identifica il tipo di messaggio Dim wParam As Integer 'parametro del messaggio (tipo e valore cambiano in funzione del tipo di messaggio inviato) Dim lParam As Integer 'altro parametro del messaggio che varia sempre in funzione del messaggio Dim time As Integer 'l'ora in cui è stato inviato il messaggio Dim pt As POINTAPI 'posizione del cursore al momento dell'invio del messaggio End Structure Private Declare Function TranslateMessage Lib "user32" (ByRef lpMsg As MSG) As Integer '============================================ 'La funzione DispatchMessage richiama la corretta procedura che deve elaborare il messaggio in base al valore del campo hwnd della struttura MSG 'N.B.: l'omissione di questa funzione porterebbe alla mancata elaborazione dei messaggi e, quindi, al probabile blocco del sistema. Private Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" (ByRef lpMsg As MSG) As Integer '============================================ Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (ByRef lpMsg As MSG, ByVal hwnd As Integer, ByVal wMsgFilterMin As Integer, ByVal wMsgFilterMax As Integer, ByVal wRemoveMsg As Integer) As Integer Private Const PM_REMOVE As Integer = &H1 'indica alla funzione PeekMessage di rimuovere il messaggio in coda Private Const lMaxCounter As Integer = 100000 '=================================================================================================== Public Sub MyDoEvents() 'funzione alternativa alla funzione di VB "DoEvents" Dim CurrMsg As MSG 'Questo loop recupera (e cancella) tutti i messaggi dalla coda e li invia alla finestra di destinazione Do While PeekMessage(CurrMsg, 0, 0, 0, PM_REMOVE) <> 0 TranslateMessage(CurrMsg) DispatchMessage(CurrMsg) Loop End Sub
quando vado per provarlo mi esce il seguente errore alla riga: TranslateMessage(CurrMsg)
errore: System.AccessViolationException
Message= Tentativo di lettura o scrittura della memoria protetta. Spesso questa condizione indica che altre parti della memoria sono danneggiate.
P.S: Codice corretto e funzionante
Ultima modifica effettuata da Dyango 22/04/11 11:56
aaa