Sodala!
Nachdem die Hauppauge WinTV Nova-S-Plus Remote per default nicht unterstützt wird (wies scheint), hab ich mich mal selber an die Arbeit gemacht. Standardmäßig kommt die Nova-S mit WinTV2000, und dem netten kleinen Tool Ir.exe. Das Ding benutzt die irremote.dll, und das können wir auch!
Die irremote.dll exportiert unter anderem folgende Funktionen:
Zitat // öffnet das IR Device
// HWND hWnd: window handle des owners
// unsigned int someConst: keine Ahnung, wird immer als 0x400 übergeben
// unsigned int verboseLevel: 0 für Ruhe, 1 für paar Message Boxes
// unsigned short devicePort: Art des Sensors
// der Returnwert gibt an, obs funktioniert hat oder nicht
bool __stdcall *IR_Open(HWND hWnd, unsigned int someConst, unsigned int verboseLevel, unsigned short devicePort);
// schließt ein zuvor geöffnetes IR Device
// der Returnwert gibt an, obs funktioniert hat oder nicht
bool __stdcall *IR_Close();
// schaltet den Sensor aus/ein, falls man das Ding mal temporär starten/stoppen will
// unsigned short onOff: 0x12 für an, 0x34 für aus
// der Returnwert gibt an, obs funktioniert hat oder nicht
bool __stdcall *IR_Power(unsigned short onOff);
// returnt die Version des IR Devices
unsigned int __stdcall *IR_GetVersion();
// die beiden Funcs returnen einen Code, der sich aus Remote und Key zusammensetzt
// unsigned char repeatCount: ref Parameter, wird intern runter gezählt
// ist ne Taste gedrückt, wird repeatCount auf 0 gesetzt
// der Returnwert gibt einen gemischten Code aus Remote und Key an,
// der durch IR_GetSystemKeyCode schön handlich aufgeteilt wird. 0x1FFF wenn nichts gedrückt wurde.
unsigned short __stdcall *IR_GetKeyCode(unsigned char &repeatCount);
unsigned short __stdcall *IR_GetKeyCodeEx(unsigned char &repeatCount);
// diese Func returnt alle möglichen Daten in nem verarbeitbaren Format
// unsigned char repeatCount: ref Parameter, siehe oben
// unsigned char remoteUsed: ref Parameter, sagt uns welche Fernbedienung den Key gesendet hat
// unsigned char remoteKey: ref Parameter, der Code vom gedrückten Key
// der Returnwert gibt an, ob etwas gedrückt wurde oder nicht
bool __stdcall IR_GetSystemKeyCode(unsigned char &repeatCount, unsigned char &remoteUsed, unsigned char &remoteKey);
Meine Remote (Remote Type 0) schickt folgende Keys zurück:
Warum ein paar Codes fehlen kann ich mir net wirklich erklären, mehr Tasten hat das Ding net
Für die PVR/2 kann ich keine Liste machen, weil ich nur eine normale Modern WinTV Remote habe.
Example Code hängt unten am Post, wenn alles gut geht bau ich ein Plugin für DD
(Die irremote.dll müsst ihr ins Verzeichnis der Example App kopieren, zu finden in eurem WinTV Ordner)
Edit: (code)-BBTags kaputt, durch Quote ersetzt
Der Beitrag wurde 2 mal editiert, zuletzt von BhaaL am 29.07.2007 - 18:07.
Das sieht ja schon mal nicht schlecht aus !
Leider kann ich da nur in so weit helfen, zu sagen wie ich es machen würde, wenn ich so eine Karte mit FB hätte:
1)
Erst mal ein kleines Stand-Alone-Tool basteln, mit dem ich sicher die FB-Codes auslesen. kann. Z.B. über einen Timer periodisch alle 100-200 mS den Status abfragen.
2)
Mit den empfangenen Tastencodes und einer Art Übersetzungstabelle aus der DD-SDK die entsprechenden Tastencodes zuweisen.
3)
Das ganze dann in ein PlugIn-Gerüst schrauben und dann nach jedem empfangen Tastencode einfach ein SendMessage an DD - Fertig.
Ob das Plugin ein Fenster hat oder nicht, scheint insofern egal, das man es ja nicht öffnen muss...
Was ich allerdings ein wenig störend finde: Es werden z.Zt. nur 47 'Tasten' unterstützt und davon auch nicht alle mit Sinn.
Ich hatte mal angefangen etwas zu basteln, was nach einem Tastendruck der FB ein Keyboardsignal auslöäsen soll - also so als wenn man DD mit Tastatur bedient.
Dann könnte man damit erheblich mehr HotKeys von DD nutzen und in geöffnete Fenster mit der FB ala SMS auch einen Text schreiben (na ja...).
Allerdings hakte das derzeit stark und ich habe das noch nicht weiter verfolgt. Werde mich da mal wieder dransetzen.
Übrigens bräuchte man das dann nicht als Plugin ausführen, sondern als ganz normales Programm. Und ander Soft auf dem Rechner könnte man dann damit auch steuern - wenn man den richtigen Fenster-Handle hat.
Vielleicht hat jemand ja Lust mit mir etwas zusammen zu proggen ?
PS: Ich mache hier nur mit Delphi V 7. C ist für mich recht kryptisch und umschreiben nach Delphi kostet mich immer irre viel Zeit.
Jo, ich bastel hier grade an ner Standalone App. Nur isses sinnvoll, da ein Plugin draus zu machen, wenn ichs für andere Sachen benutzen will wird das sowiso davon unabhängig geschehen.
Für die Delphianer unter uns:
Zitat function IR_Open(hWnd: HWND; someConst: LongInt; verboseLevel: LongInt; devicePort: Word) : Boolean; stdcall external 'irremote.dll'
procedure IR_Close; stdcall external 'irremote.dll'
function IR_Power(onOff: Word) : Boolean; stdcall external 'irremote.dll'
function IR_GetVersion : LongInt; stdcall external 'irremote.dll'
function IR_GetKeyCode(var repeatCount: Byte) : Word; stdcall external 'irremote.dll'
function IR_GetKeyCodeEx(var repeatCount: Byte) : Word; stdcall external 'irremote.dll'
function IR_GetSystemKeyCode(var repeatCount: Byte; var remoteUsed: Byte; var remoteKey: Byte) : Boolean; stdcall external 'irremote.dll'
Nicht getestet, sollte aber funktionieren. Die Get(System)KeyCode(Ex) Parameter müssen halt Pointer sein
Der Beitrag wurde 4 mal editiert, zuletzt von BhaaL am 29.07.2007 - 18:29.
function IR_Open(Windowh : hWnd; someConst: cardinal; verboseLevel: cardinal; devicePort: word) : boolean; stdcall external 'irremote.dll' name 'IR_Open';
function IR_Close() : boolean; stdcall external 'irremote.dll' name 'IR_Close';
function IR_Power(onOff : word) : boolean; stdcall external 'irremote.dll' name 'IR_Power';
function IR_GetVersion() : cardinal; stdcall external 'irremote.dll' name 'IR_GetVersion';
function IR_GetKeyCode(var repeatCount : byte) : word; stdcall external 'irremote.dll' name'IR_GetKeyCode';
function IR_GetKeyCodeEx(var repeatCount : byte) : word; stdcall external 'irremote.dll' name 'IR_GetKeyCodeEx';
function IR_GetSystemKeyCode(var repeatCount : byte; var remoteUsed : byte; var remoteKey : byte) : boolean; stdcall external 'irremote.dll' name'IR_GetSystemKeyCode';
Die Funktionen GetKeyCode, GetKeyCodeEx und GetSystemKey müssen dann mit vorher deklarierten Variablen des entsaprechenden Typs aufgerufen werden und der Wert steht dann anschließend da drin.
Huch, bin wohl ein bisschen eingerostet in Delphi :>
GetKeyCode und GetKeyCodeEx rufst du mit nem Counter-wert auf, zb 100. Der zählt intern dann runter (und gibt für nicht erfolgreiche Aufrufe ein 0x1FFF bzw $1FFF zurück). Kannst du benutzen, um beispielsweise 100 Durchläufe zu machen, und dann abzubrechen; wenn eine Taste gedrückt wurde, wird der Wert auch auf 0 gesetzt.
Der Rückgabewert der beiden ist so ne Mischung aus Remote Type (welche Fernbedienung das war), welche Taste gedrückt wurde und ein paar intern verwendeten Sachen, die uns nicht interessieren. Der Remote Type wäre (returnWert and $1F), die gedrückte Taste ((returnWert shr 7) and $7F).
GetSystemKeyCode übernimmt das ganze für dich, und gibt Remote Type bzw. Key Code in den jeweiligen Parametern zurück, analog mit dem Counter. Der Returnwert is brauchbarer, true = Taste gedrückt, false = keine Taste.
Dachte Anfangs die GetKeyCode/Ex Funktionen sind wichtiger, aber die GetSystemKeyCode func macht das ganze wesentlich einfacher.
Bin momentan dabei, meine C++ GUI-Klassen ein wenig auszubauen, von daher werd ich erst mal auf der C-Schiene bleiben. Wenns nix wird kann ich ja immer noch rüber zu Delphi, is ja net viel Aufwand.
Hab dir btw ne Mail geschickt.
Hat sich hier etwas getan? Falls nicht, werde ich das Ding in den kommenden Semesterferien proggen, da es mich etwas ärgert, meine Fernbedienung nicht nutzen zu können.
Wollte mal hören ob das ganze hier noch jemanden interessiert.
Ich habe den source mal ausprobiert - leider bekomme ich immer die nachricht "Could not open device".
Könnte es sein das es an dem devicePort liegt ? habe alle aufgeführten varianten ausprobiert.
Auch Auto detect konnte mir nicht weiterhelfen (Habe eine Hauppauge Win TV HD DVB-S )
Es ist / sind gerade kein registrierte(r) Benutzer und 47 Gäste online. Neuester Benutzer: hugomontenegro
Mit 580 Besuchern waren am 06.01.2010 - 18:31 die meisten Besucher gleichzeitig online. AdministratorModeratorMemberUser