000
28.07.2005, 22:33 Uhr
~caipicascade
Gast
|
Hallo,
ich habe einen globalen WH_CALLWNDPROC Hook gesetzt (in meinem Programm, ohne dll, siehe http://neworder.box.sk/newsread_print.php?newsid=10952).
Die Callback-Funktion soll im Falle von LVM_ -SETITEMTEXT, -SETITEM, -INSERTITEM, also wenn ein neues Listview-Item erstellt / ihm ein Text zugewiesen wird, den Text überprüfen, und wenn er eines von mehreren vordefinierten 'verbotenen Wörtern' enthält, möchte ich das Item entfernen oder die Message gar nicht erst bei der Listview ankommen lassen.
Hier erstmal mein Code:
Code: |
#include <stdio.h> #include <windows.h> #include "commctrl.h"
// our global callwndproc-hook-callback-function needs dll-compliance #define WINEXPORT extern "C" __declspec (dllexport)
// global pointer var for later use in local callback HHOOK hHook;
WINEXPORT LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam ) { // if message is not allowed to process, return CallNextHookEx.. if ( nCode < 0 ) return CallNextHookEx( hHook, nCode, wParam, lParam ); // if message is safe to process, continue.. if ( ( nCode == HC_ACTION ) && ( wParam == 0 ) ) { // examine the CWPSTRUCT. does it contain a relevant message? CWPSTRUCT *myCWP = (CWPSTRUCT*)lParam; // does the message create/change an ANSI lvitem? if (( myCWP->message == LVM_INSERTITEMA ) || ( myCWP->message == LVM_SETITEMA ) || ( myCWP->message == LVM_SETITEMTEXTA )) { // yes. let's examine the ANSI LVITEM LVITEMA *myLVIA = (LVITEMA*)myCWP->lParam; // problem resides HERE, any action (e.g. printf/sendmessage) // crashes the process who is about to receive the message..! // LVITEMA->pszText check required here // LVITEMA->iItem should then eventually be removed.. PostMessageA( myCWP->hwnd, LVM_DELETEITEM, myLVIA->iItem, 0 ); } // does the message create/change a UNICODE lvitem? if (( myCWP->message == LVM_INSERTITEMW ) || ( myCWP->message == LVM_SETITEMW ) || ( myCWP->message == LVM_SETITEMTEXTW )) { // yes. let's examine the UNICODE LVITEM LVITEMW *myLVIW = (LVITEMW*)myCWP->lParam; // problem resides HERE, any action (e.g. printf/sendmessage) // crashes the process who is about to recieve the message..! // LVITEMW->pszText check required here // LVITEMW->iItem should then eventually be removed.. } } return 0; // MSDN says, better return CallNextHookEx( hHook, nCode, wParam, lParam ); // to allow other hooks, but this crashes explorer & more.. }
long SetHook ( int iSwitch ) { if ( iSwitch == 1 ) { // 1 = register hook in hookchain as global hook hHook = SetWindowsHookEx ( WH_CALLWNDPROC, (HOOKPROC)CallWndProc, GetModuleHandle(NULL), 0 ); // params, results? printf( "SetWindowsHookEx( %d, %d, %d ) = %d\n", WH_CALLWNDPROC, (HOOKPROC)CallWndProc, GetModuleHandle(NULL), hHook ); return( hHook != NULL ); } else { // 0 = unregister hook int result; result = ( UnhookWindowsHookEx( hHook ) != 0 ); printf( "UnhookWindowsHookEx( %d ) = %d\n", hHook, result ); } }
|
Also, wie in den Kommentaren vermerkt, crashed die Applikation der die Message gehört, wenn ich irgendeine Aktion ausführen will, und sei es bloss ein printf..! Ich möchte an den beiden vermerkten Stellen den Text des Items überprüfen und es dann gegebenenfalls entfernen.
Kann mir jemand dabei weiterhelfen? Vielen Dank schon mal im Voraus.. |