GothicCrusader Δημοσ. 3 Ιουνίου 2003 Δημοσ. 3 Ιουνίου 2003 Μιλάγε για mfc application, αλλά αυτό δεν έχει πολύ σημασία μιας και κυρίως το πρόβλημα είναι στην winapi function SetWindowsHookEx και στην υλοποιησή της. Αν βρει κανένας λύση πραγματικά θα του δώσω τα υπόλοιπα βιβλία που απομένουν στη βιβλιοθήκη. Έχω ήδη φάει τα άλλα μισά από το κακό μου! <img src="http://www.insomnia.gr/ubbthreads/images/graemlins/mad.gif" alt="" /> <img src="http://www.insomnia.gr/ubbthreads/images/graemlins/mad.gif" alt="" /> Το πρόγραμμα: Με λίγα λόγια κάνει hook το keyboard, παρακολουθεί τα πάντα που πληκτρολογούνται από τον χρήστη, και ελέγχει αν πατήθηκε το f10 ή το alt f-10 τυπώνοντας ανάλογα το αντίστοιχο μήνυμα. Το πρόβλημα: Στα win98 γίνεται illegal operation μόλις πατηθεί κάτι ενώ το app δεν έχει το focus. Στα winxp το πρόγραμμα παύει να παρακολουθεί το τι πληκτρολογείται αν πατηθεί κάτι ενώ αυτό δεν έχει το focus. παραθέτω μόνο τα απαραίτητα κομμάτια του κώδικα: oninitdialog: > BOOL CTenHookDlg::OnInitDialog() { ...code omitted... g_hHook = SetWindowsHookEx(WH_KEYBOARD, MyKeyboardHook, GetModuleHandle(NULL), 0); if (g_hHook == NULL) { MessageBox("Couldn't set the keyboard hook!"); EndDialog(IDCANCEL); } return TRUE; } MyKeyboardHook: > LRESULT CALLBACK MyKeyboardHook( int nCode, // hook code WPARAM wParam, // virtual-key code LPARAM lParam // keystroke-message information ) { if (nCode == HC_ACTION) { CWnd* pWnd = AfxGetMainWnd(); // F10-key with ALT (only!) depressed? if (wParam == VK_F10) { LPARAM bAltPressed = 0; if (IsKeyDown(VK_MENU) && !IsKeyDown(VK_SHIFT) && !IsKeyDown(VK_CONTROL)) bAltPressed = 1; pWnd->PostMessage(WM_USER+10, 1, bAltPressed); return 1; } else { pWnd->PostMessage(WM_USER+10, 0, 0); } } return CallNextHookEx(g_hHook, nCode, wParam, lParam); } message map: > BEGIN_MESSAGE_MAP(CTenHookDlg, CDialog) //{{AFX_MSG_MAP(CTenHookDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_MESSAGE(WM_USER+10, OnMyKeyMessage) END_MESSAGE_MAP() OnMyKeyMessage: > LRESULT CTenHookDlg::OnMyKeyMessage(WPARAM wParam, LPARAM lParam) { CWnd* pWnd = GetDlgItem(IDC_STATUS); ASSERT(pWnd != NULL); if (!wParam) pWnd->SetWindowText("You've pressed a key, but it wasn't F10!"); else { if (lParam) pWnd->SetWindowText("You pressed ALT+F10!"); else pWnd->SetWindowText("You pressed F10, but the ALT key wasn't down."); } return 0; }
GrMikeD Δημοσ. 3 Ιουνίου 2003 Δημοσ. 3 Ιουνίου 2003 Hook functions se system level doulevoun mono se DLLs, pote sto executable (kai idiaitera MFC bliax...)! Apla tin MyKeyboardHook() tha exeis sto executable sou kai tha stelneis ton pointer tis se katallili sunartisi tou dll. Den borw na se boithisw perissotero giati pleon exw paratisei ton programmatismo kai mono skavw...
GothicCrusader Δημοσ. 3 Ιουνίου 2003 Μέλος Δημοσ. 3 Ιουνίου 2003 οϊμέ! άντε να το κάνω dll δηλ... μια κουβέντα είναι Το κουλό είναι ότι δοκίμασα με hook WH_JOURNALRECORD και με extern τις μεταβλητές και λειτουργεί μια χαρά ρε γμτ.. Δηλαδή πιάνει και mouse και keyboard, ενώ μόλις το γυρίσω σε WH_KEYBOARD δουλεύει μέχρι να κάνω focus στο desktop και να πατήσω ένα οποιοδήποτε πλήκτρο. Μόλις πατήσω έστω και ένα σταματάει να παίρνει τα μηνύματα το app. btw, πάντως σε όλο τον κώδικα πάνω μόνο η AfxGetMainWnd είναι από MFC :Ρ Αλλά τι να κάνεις, να γράψεις όλο το πρόγραμμα σε api;; :{
GothicCrusader Δημοσ. 3 Ιουνίου 2003 Μέλος Δημοσ. 3 Ιουνίου 2003 ρε γμτ.. πέρασα σε dll την sethook, clearhook και την MyKeyboardHook και πάλι το ίδιο πράγμα γίνεται... αν υπάρχει κανένας σχετικός να του δώσω το source να το παλέψουμε ας το πει...
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.