Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Windows Hook problem

Postades av 2003-09-02 10:43:42 - Sunny Jones, i forum c++, Tråden har 2 Kommentarer och lästs av 1253 personer

Jag försöker göra en dll i Visual C++ som skall vidarbefodra WNDPROC-meddelanden
till ett VB-program.

Den dll som jag försöker efterskapa är Easyhook.dll som går att ladda ner här:
http://usuarios.bitmailer.com/felisart


Lite kod ifrån C dll´en
SetCallWndHook är en funktion i dll´n som tar emot och lagrar en adress
till en subrutin i VB-programmet som sedan skall vara mottagare av WNDPROC informationen.

int __declspec(dllexport) CALLBACK SetCallWndHook(long ptrfunction)
{
if( g_hHook!=NULL ) return 0;
// Lagrar adresspekaren
ptrCallWndHook = ptrfunction;
//Lägger in sig i windowskön
g_hHook = ::SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, g_hInstance, 0);

if( g_hHook != NULL) {
return 1;
} else {
return 0;
}
}

Går ur windowskön
int __declspec(dllexport) CALLBACK CallWndUnhook()
{
if( g_hHook == NULL ) return 0;
int bRet = ::UnhookWindowsHookEx(g_hHook);
g_hHook = NULL;
return bRet;
}

Den här funktionen är den som tar emot meddelanden
ifrån windows som den sedan skall vidarbefodra
till subrutinen i VB.
LRESULT WINAPI CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
// Avbryt direkt om nCode är mindre än 0
if (nCode < 0) return CallNextHookEx(g_hHook, nCode, wParam, lParam);

// Annars så hämtas meddelandet
PCWPSTRUCT pcwps;
pcwps = (PCWPSTRUCT)lParam;


// Hämtar den externa funktionenspekaren
typedef void (__stdcall *FNPTR)(int code, long lParam, long wParam, long message, long hwnd);
FNPTR FunctionCall;
FunctionCall = (FNPTR)ptrCallWndHook;

// Kallar på den externa funktionen
FunctionCall(nCode, pcwps->lParam, pcwps->wParam, pcwps->message, pcwps->hwnd);

// Släpper iväg meddelandet till nästa
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}


I VB-programmet så kallar jag på funktionerna i dll´n:
Declare Function SetCallWndHook Lib "testdll_library.dll" (ByVal ptrfunction As Long) As Long

Declare Function CallWndUnhook Lib "testdll_library.dll" () As Long

Hoppar in i meddelandekön
Dim Result As Long
Result = SetCallWndHook(App.hInstance, AddressOf CallWndProc)


Hoppar ur meddelandekön
Dim Result As Long
Result = CallWndUnhook()


När meddelandet skall skicka infomationen till VB så fungerar det inte. Jag har provat med att skippa att tolka meddelandet och bara skicka siffran 1 till VB men det fungerar inte ändå. Så det verkar som att det inte går att skicka något till VB-subrutinen ifrån CallWndProc-funktionen. Det kanske blir någon korsreferens eller liknande. Som ni ser på koden så är inte någon C-programmerare och windowshooking är väl inte direkt det första man bör mecka med då det är väldigt viktigt att man gör allt helt rätt.

Är det någon som kan hjälpa mig med att lösa problemet så är jag oerhört tacksam.


Svara

Sv: Windows Hook problem

Postades av 2003-09-02 23:07:55 - Mattias Sjögren

Adressen du skickar till DLLen från VB med AddressOf är bara giltig inom VB programmets process. I en global hook som kan köras från vilken process som helst kan du alltså inte använda pekare hur som helst.

En vanlig lösning är att skicka in ett HWND för något fönster i programmet istället, och sedan skicka tillbaka information till programmet från hook DLLen med PostMessage.


MS


Svara

Sv: Windows Hook problem

Postades av 2003-09-04 11:26:43 - Sunny Jones

Men i EasyHook.dll tycks utvecklaren ha gått runt problemet med AdressOf i VB.
När jag använder mig av den så behöver jag bara göra jag så här:

'----------Hook SENT messages BEFORE call the windowproc----
Declare Function SetCallWndHook Lib "easyhook.dll" (ByVal ptrfunction As Long) As Long
Declare Sub CallWndUnhook Lib "easyhook.dll" ()

'///////// PSEUDO HOOK PROCEDURES /////////////
'//// All procedures will be called in your Application thread
'//// you can call any VB, API, DRAWING function without multithreading
'//// problems.///////

'//// YOU DON'T GET MESSAGES FOR YOUR PROCESS
'//// While running inside the VB IDE your application and VB itself
'//// run in the same process.

'//// ProcessID parameter is the Process Identifier of the process that
'//// owns the message

'//// For more information read "HOOKS" in Win32.hlp file ////////

Function CallWndProc(ByVal ProcessId As Long, ByVal code As Long, ByVal wParam As Long, lParam As CWPSTRUCT) As Long
'-You don't get messages with code <0,
'-they are redirected to CallNextHookEx at Dll level---

'-You can't modify the messages

Dim texto As String, buff As String, i As Integer
If lParam.message > -5000 And lParam.message < 5000 Then
texto = WMMenStr(lParam.message)
Else
texto = CStr(lParam.message)
End If

'Kod för att visa meddelandet....osv

CallWndProc = 0 '// return value should be zero
End Function

Här kan man ladda ner ovanstående projekt:
http://usuarios.bitmailer.com/felisart/

Det är exakt så som jag vill göra min egen C++ dll.
Jag har försökt få kontakt med utvecklaren av den här dll´n utan framgång.


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 615
27 953
271 709
5 542
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies