Wie muß ein Horchthread aussehen?



  • Hallo,

    aaalso, ich möchte (immer noch :)) einen Thread haben, der horcht, ob am Pocket PC eine der Hardwaretasten gedrückt wird.
    Das will ich mit der Memberfunktion OnKeyUp von CWnd machen.
    Dazu hab ich ne Klasse MyCWnd erstellt, die von CWnd abgeleitet ist und die OnKeyUp-Funktion überschreibt (oder überlädt?). Dann hole ich von meinem Fenster den HWND-Handle und übergebe den mit Attach an mein MyCWnd-Objekt.
    Und dann soll eben ein Thread gestartet werden, der immer aktiv ist, solange das Fenster offen ist, und der eben dann die von mir definierte OnKeyUp-Funktion auslöst, wenn eine Taste gedrückt bzw. losgelassen wird.
    Kann mich jemand in die richtige Richtung stupsen?

    Kox



  • Hat keiner eine Idee? Bitte um Hilfe!

    Kox



  • Ich will mal noch die entsprechenden Quelltexthäppchen schreiben:

    Hier leite ich die Klasse ab:

    class MyCWnd : public CWnd 
    {
    public:
    
    	MyCWnd();
        virtual ~MyCWnd();
    
        afx_msg void OnKeyUp (UINT nChar, UINT nRepCnt,UINT nFlags);
    };
    

    Das ist das überladen der OnKeyUp-Funktion:

    void MyCWnd::OnKeyUp (UINT nChar, UINT nRepCnt,UINT nFlags)
     {
    
    	unsigned long *volume_pointer;
    	unsigned long volume;
    	unsigned long new_volume;
    	char wavName[]  = "\\windows\\Default.wav";
    	CString csName = CString (wavName);
    	volume_pointer = &volume;
    	waveOutGetVolume(HWAVEOUT WAVE_MAPPER, volume_pointer);
    	switch (nChar){
    		case 38: {
    			if (volume+0x2000 > 0xFFFF) new_volume = 0xFFFF;
    			else new_volume = volume+0x2000;
    			waveOutSetVolume(HWAVEOUT WAVE_MAPPER,new_volume);
    			PlaySound(csName, NULL, SND_SYNC | SND_FILENAME);
    			break;
    				 }
    		case 40: {
    			if (volume < 0x2000) new_volume = 0x0000;
    			else new_volume = volume-0x2000;
    			waveOutSetVolume(HWAVEOUT WAVE_MAPPER,new_volume);
    			PlaySound(csName, NULL, SND_SYNC | SND_FILENAME);
    			break;
    				 }
    
    	}
    
    }
    

    und hier starte ich meinen Listener-Thread:

    MyCWnd* pWnd = new MyCWnd;
    
    	pWnd->Attach(hwnd);
    
    	mythread = AfxBeginThread(
    		KeyListener,
    		pWnd,
    		THREAD_PRIORITY_NORMAL,
    		0,
    		0,
    		NULL);
    

    der bisher nur so aussieht:

    static UINT KeyListener(LPVOID Pparam) {
    	MyCWnd *cwnd = (MyCWnd*) Pparam;
    	while (cwnd) {
    		Sleep(0);
    	}
    	return 0;
    }
    

    Ist das so ok? Was fehlt noch, damit er auch listened?

    Kox


Anmelden zum Antworten