PDA

Vollständige Version anzeigen : WheelMouse - Rad in Form abschalten - DS-Wechsel verhindern > Absturz nach Einbau ???


AWSW
24.06.2001, 18:15
Hallo liebes Forum,
heute habe ich mich etwas mit der Funktion des Verhinderns des Mausrades einer WheelMouse befasst. Ich hatte mich durch die Forum-Suchmaschine gewühlt und auch einen Beitrag dazu gefunden, da mir die in der FAQ auf donkarl.com bereitgestellten Links nicht wesentlich weiter geholfen haben.

Ich wurde hier im Forum auch natürlich fündig :) bei einem Beitrag namens: "Scroll-Rad bei einer Maus" vom 28.02.2001 von Hightower, der unter anderem von Claudia mit dem nachfolgenden Script netter Weise beantwortet wurde:


Modul: bas_AddrOf


Option Compare Database
Option Explicit
Private Declare Function GetCurrentVbaProject Lib "vba332.dll" Alias "EbGetExecutingProj" (hProject&) As Long
Private Declare Function GetFuncID Lib "vba332.dll" Alias _
"TipGetFunctionId" (ByVal hProject&, ByVal strFunctionName$, ByRef strFunctionId$) As Long
Private Declare Function GetAddr Lib "vba332.dll" Alias _
"TipGetLpfnOfFunctionId" (ByVal hProject&, ByVal strFunctionId$, ByRef lpfn&) As Long

Public Function AddrOf&(strFuncName$)
Dim hProject&, lResult&, lpfn&
Dim strID$, strFuncNameUnicode$
Const NO_ERROR = 0
AddrOf = 0
strFuncNameUnicode = StrConv(strFuncName, vbUnicode)
Call GetCurrentVbaProject(hProject)
If hProject <> 0 Then
lResult = GetFuncID(hProject, strFuncNameUnicode, strID)
If lResult = NO_ERROR Then
lResult = GetAddr(hProject, strID, lpfn)
If lResult = NO_ERROR Then: AddrOf = lpfn
End If
End If
End Function

Modul: bas_MOUSEWHEEL


Option Compare Database
Option Explicit
Public lpPrevWndProc As Long
Public Const GWL_WNDPROC = (-4)
Public Const WM_MOUSEWHEEL = &H20A
Public Declare Function SetWindowLong Lib "user32" Alias _
"SetWindowLongA" (ByVal hWnd&, ByVal nIndex&, ByVal dwNewLong&) As Long
Public Declare Function CallWindowProc Lib "user32" Alias _
"CallWindowProcA" (ByVal lpPrevWndFunc&, ByVal hWnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&) As Long
Public Function SubWindowProc(ByVal hWnd&, ByVal uMsg&, ByVal wP&, ByVal lP&) As Long
On Error Resume Next

If uMsg = WM_MOUSEWHEEL Then
SubWindowProc = 1
Exit Function
End If
SubWindowProc = CallWindowProc(lpPrevWndProc, hWnd, uMsg, wP, lP)
End Function

Public Sub HookMe(hw&)
' in Access 97: mangels AddressOf Operator das work-around AddrOf verwenden!
'lpPrevWndProc = SetWindowLong(hw&, GWL_WNDPROC, AddrOf("SubWindowProc"))
' in Access 2K
lpPrevWndProc = SetWindowLong(hw&, GWL_WNDPROC, AddressOf SubWindowProc)
'Hier war in dem Orginalscript von Claudia 2x ein " - Anführungszeichen zu viel bei SubWindowProc
End Sub

Public Sub UnHookMe(hw&)
If lpPrevWndProc& <> 0 Then: Call SetWindowLong(hw&, GWL_WNDPROC, lpPrevWndProc&)
lpPrevWndProc = 0
End Sub

Beim Öffnen des Formulares wird dann dieser Text verwendet:
Habe hier das beim Öffnen Ereignis nehmen müssen, da sonst (beim Laden) das Formular gar nicht mehr zu öffnen war


Private Sub Form_Open(Cancel As Integer)
Call HookMe(Me.hWnd)
End Sub

Beim Entladen des Formulares wird dann dieser Text verwendet:


Private Sub Form_Unload(Cancel As Integer)
Call UnHookMe(Me.hWnd)
End Sub

So weit so gut, bis auf den kleinen Syntaxfehler den mein Access 2000 Compiler doch gerne berichtigt haben wollte ;)


Die Frage oder das Problem, dass sich mir bei dieser ganzen Sache auftut, obwohl es am Ende doch wie gewünscht klappt...,
ist: Warum hängt sich nach Einbau der Beim Öffnen bzw. Beim Entladen - Ereignisse mein komplettes Access total
auf ??? Nach der dann nur noch möglichen Beendigung über den Win2k-Taskmanager kann ich die DB normal öffnen und auch die
Funktion wird ohne Absturz ausgeführt...

Ich kenne auch das Beispiel namens: WheelMouseOff2k.zip das glaube ich auf Millstore.at zu finden war und wenn ich mich
recht erinnere den gleichen Inhalt hat. Bei diesem schiesst sich aber mein ganzes System ab. An diesem kann es wohl auch
nicht liegen: Windows 2000 Professional mit 768 MB RAM... Das gleiche habe ich auch auf anderen Rechnern und bei einem
Kollegen, der sich auch sehr viel mit Access beschäftigt ist der selbe Effekt zu finden...

Also könnt Ihr mir sagen, warum sich erst mal nach Einbau der Funktion in ein Formular die DB völlig verabschiedet und
dann nach dem darauf folgenden Neustart der selben wieder wie gewünscht fünktioniert ??? ??? ???

Ich selbst vermute, dass beim Schließen des grade noch im Entwurfmodus befindlichen Formulares dann schon einmal das
UnhookMe(Me.hwnd) aufgerufen wird... Aber auch nur eine bescheidene Vermutung :D

Maxs
25.06.2001, 17:27
hallo AWSW

erstmal danke für Deine hilfe

ich hab gerade nochmal nachgeschaut - und die von Dir angesprochene frm-Eigenschaft ist auf "Keine Sperrung" eingestellt.
ich wollte das ganze aber auch noch mit einer msgbox (vbyesnoCancel)verbinden
wenn der user dann auf "Nein" klickt -
das dann das frm geschlossen wird und die
änderungen halt nicht übernommen werden
kannst Du mir helfen ?
ich hoffe es jetzt ein wenig deutlicher geworden
- sorry - das vorhin so knapp war
:-)
mfg maxs

Günther Kramer
25.06.2001, 22:08
Hallo Axel,

versuche es doch mal hier. Ich denke von dieser Seite hat Claudia den Code.
http://members.aon.at/millpartner

Johann Pumhösl
25.06.2001, 23:18
Ruf die Funktion UnhookMe einfach nicht auf!

HTH johann

AWSW
25.06.2001, 23:31
Hallo Günther,
besten Dank für den Link. Ich hatte den aber auch aus den in den da aufgeführten Beispielen probiert und habe eben sogar festgestellt, dass sich die DB dadurch, nach dem ich den Aufruf des Moduls in alle für mich benötigte Fomulare eingebunden habe und wie schon erwähnt, dann mit einem Absturz gekrönt beendet habe, dann komplett zerschossen hat. Ich habe nämlich in dieser DB einen Zähler integriert, der nach dem der Wert 15 erreicht ist, die DB beim nächsten Schließen komprimiert. Als ich die DB wieder nach dem Absturz geöffnet habe und dann weiter gearbeitet habe und dann irgendwann schließen wollte, erhielt ich dann die Fehlermeldung, dass die DB nicht komprimiert werden kann, weil ich und einige weitere User gerade im Moment darauf zugreifen und Änderungen vornehmen >>> ??? :confused:

Danach war das Teil nicht mehr zugebrauchen, da es die wildesten Fehlermeldungen brachte... und ich habe meine Sicherungskopie, die ich glücklicherweise vor der ganzen Aktion angelegt hatte wieder ausgepackt und dass ganze noch mal eingebaut und dann folgendes anders gemacht:

Nach dem Einbau der Beim Öffnen und Beim Entladen - Aufrufe (HookMe & UnHookMe), habe ich dann die DB gespeichert (Formulare noch immer im Entwurfmodus) und die DB danach sofort beendet. Soweit es mir grade noch möglich war, würde ich sagen, das Ding ist jetzt OK...

Werde das aber erst noch näher testen...


Ansonsten Danke & Gut´s Nächtle allerseits :D

AWSW
25.06.2001, 23:39
Hallo Johann,
das habe ich auch schon probiert, aber dann laufen nachdem ich die Dateneingabe, in der ich das Modul gerne integrieren wollte, beendet habe verschiedene Endlosformualar-Auflistungen nicht mehr, bei denen ich doch ganz gerne die Scrollfunktion haben möchte...

Ich frage mich halt nur, warum das Teil dann so crashed, dass die DB wie eben nur noch für die Tonne gedacht ist ???

Wäre toll, wenn wir das noch klären könnten, da ich mit den bei MS in der KB aufgeführten Vorschlägen, die Mausradfunktion in der Systemsteuerung ganz abzuschalten absolut nicht überein komme. Da macht man sich das doch schon sehr einfach - oder ???

Die Funktionslösung finde ich schon an sich sehr klasse, allerdings bringt sie mir wie schon erwähnt einige Bauchschmerzen, wenn ich nicht sicher sein kann, danach noch die DB zu nutzen...

Aber trotzdem Vielen Dank, ich werdem dem Morgen früh - ehhh ne gleich mal auf den Grund gehen, vielleich finde ich ja noch was...

Bis dann dann :D

A.S.
26.06.2001, 05:33
Zum Thema WheelMouse gibt es bei Dev Asish noch einige Artikel:

<a href="http://www.mvps.org/access/api/api0036.htm">API: Track IntelliMouse's Wheel</a>
<a href="http://www.mvps.org/access/downloads/frmMouseWheel.txt">Schlecht Dokumentierter Source</a>

Habe das Material nicht geprüft sondern nur überflogen und mir auch nicht das Beispiel bei Millpartner angesehen. Evtl. kann man aus dem ersten Artikel etwas ableiten mit dem man das MouseWheel ohne Probleme abschalten kann.

------------------
HTH

Arno

Johann Pumhösl
26.06.2001, 14:38
Kann es sein, dass du mich ein wenig in die Irre führst?

Im Beispiel WheelMouseOff wird das Subclassing auf "e i n" Form angewendet.

So wie ich aber - jetzt erst -deine Antwort verstehe, öffnest du mehrere Forms, und dann ist das ganze natürlich nicht mehr so zu handeln.

Daher müsstest du auch für jedes Form
ein Subclassing erzeugen, (lpPrevWndProc1,
lpPrevWndProc2, usw) und die UnhookMe(..)kann dann in der von mir dargestellten Form nicht verwendet werden, da ja dort nur immer lpPrevWndProc zurückgesetzt wird.

AWSW
26.06.2001, 16:30
Hallo & Danke Johann,
nein da habe ich mich wohl falsch ausgedrückt... Insgesammt habe ich 3 Forms, die ich aber niemals gleichzeitig öffnen kann. Wenn das eine geöffnet wird, führt natürich dann HookMe aus und bei Entladen wieder UnHookMe. Dann wir immer erst ein Hauptbildschirm geöffnet, von dem ich die anderen Forms auch nur separat starten kann. Die Forms sind niemals gleichzeitig anschauber, also sollte auch wenn es immer sauber geladen&beendet, geladen&beendet, geladen&beendet wird doch auch klappen, oder verstehe ich da was ganz falsch ???

Für weitere Hilfe, bin ich aber jetzt schon dankbar :)

AWSW
26.06.2001, 16:33
Fast vergessen :) Danke Arno schau ich mir gleich mal an...

PS: Hast Du noch mal einen Blick in die Schrift+Hintergrund-FarbDB geschaut ??? Danke

A.S.
27.06.2001, 10:07
Hallo Axel,

mea culpa, habe derzeit auf der Arbeit soviel zu tun, das ich kaum dazu komme meine Kunden zufrieden zu stellen. Werde mich daran begeben sobald ich ein ruhiges Wochenende gefunden habe. Deswegen wird meine Site wohl auch eine ewige Baustelle bleiben :cool:

Was anderes, geh doch mal bitte ins Forum "Sonstiges" und sehe Dir dort den Thread zur Anzeige von Beiträgen einmal an. Evtl. gibst Du ja mal einen Erfahrungsbericht zur Heimserver.de ab.

Thx im voraus.

------------------
HTH

Arno