Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Globale Hotkeys

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 18.10.2010, 20:33    Titel: Globale Hotkeys Antworten mit Zitat

Hallo Leute!

Ich habe mir ein kleines Programm geschrieben, das STRINGs aus der Zwischenablage extrahiert, um sie in einem separaten Speicherbereich abzulegen. Zweck ist, dass man mehrere "Slots" für die Zwischenablage zur Verfügung hat.
Das Programm kann in den Systray verschwinden und aus diesem wieder auftauchen; bisher funktioniert das aber nur per Mausklick. Jetzt möchte ich, dass das auch per Tastatur funktioniert. Leider werde ich aus der win32.hlp bzgl. Global Hotkeys nicht schlau...

Mein Versuch nach ersten Internetrecherchen:
* Via GlobalAddAtom einen String registrieren, der den Hotkey Identifiziert
* Mittels RegisterHotkey den Key eintragen
* die Nachricht WM_HOTKEY abfangen

Bisher sähe das so aus:
Code:

...
DIM SHARED AS ATOM HotKeyID

...

SUB DlgMain_Init ()     ' called with the WM_INITDIALOG Event
   HotKeyID = GlobalAddAtom("CTRL+ALT+SHIFT+E")
   
   RegisterHotKey( _
      hWnd, _
      HotKeyID, _
      MOD_ALT, _
      &H45 _
   )
...
END SUB

...

FUNCTION WndProcMain (...)
   Select Case uMsg
      ...
      Case WM_HOTKEY
         InfoBox( Str(wParam) )
      ...
   End Select


Tatsächlich passiert gar nix, wenn [ALT] + [E] gedrückt wird. Wo liegt der Fehler bzw. was vergesse ich?

Die Forensuche hat leider nur das hier zutage gebracht:
http://forum.qbasic.at/viewtopic.php?t=5622&highlight=hotkey
Das sicher nützliche Codebeispiel liegt nicht mehr auf dem Server, der Link ist 404...

Vielen Dank schonmal für die Hilfe!


Have a nice day
Ciao
Dusky Joe
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 19.10.2010, 11:56    Titel: Antworten mit Zitat

Hi,
ich kenne nur diese Methode aus dem freebasic.net/forum:
Code:
'HOTKEY by Sisophon2001
'http://www.freebasic.net/forum/viewtopic.php?p=100271&sid=62208455b9230fb6f27ab5280956de87#100271
#Include "windows.bi"

Dim As HWND hwnd
Dim Shared As WNDPROC OrgWndProc

Declare Function NewWndProc( hWnd   As HWND, uMsg   As UInteger, _
wParam As WPARAM, lParam As LPARAM) As LRESULT

Screen 18, 32
ScreenControl 2, Cast(Integer,hwnd)'fb.GET_WINDOW_HANDLE = 2
OrgWndProc = Cast( WNDPROC, GetWindowLong( hwnd, GWL_WNDPROC))
SetWindowLong( hwnd, GWL_WNDPROC, Cast(Integer, @NewWndProc))
SendMessage( hwnd, WM_USER+&h100, 0, 0)

Do
  Print Time' Prog läuft noch
  Sleep 1000
Loop Until MultiKey(1)

Function NewWndProc( hWnd As HWND, uMsg As UInteger, _
  wParam As WPARAM, lParam As LPARAM) As LRESULT

  Select Case uMsg

    Case WM_USER+&h100
      If RegisterHotKey( hWnd, 99, MOD_CONTROL Or MOD_SHIFT , VK_E) = 0 Then 'CTRL + SHIFT + e
        EndDialog(hWnd, 0)
      End If
    Case WM_HOTKEY
      If wParam = 99 Then
          ShowWindow(hWnd,SW_SHOWNORMAL)
          SetForegroundWindow(hWnd)
          MessageBox(hWnd, "CTRL + SHIFT + e gedrückt!", "HOTKEY", MB_OK)
          Cls
      EndIf

    Case WM_DESTROY
      UnregisterHotKey( hwnd, 99)
      SetWindowLong( hWnd, GWL_WNDPROC, Cast( Integer, @OrgWndProc))

  End Select

  Return CallWindowProc( OrgWndProc, hWnd, uMsg, wParam, lParam)
End Function


EDIT/
Quelltext angepasst
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.


Zuletzt bearbeitet von volta am 19.10.2010, 20:10, insgesamt 3-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 19.10.2010, 17:36    Titel: Antworten mit Zitat

Die Abfrage " If LoWord(lParam) = (MOD_CONTROL Or MOD_SHIFT) And HiWord(lParam) = VK_E Then" ist unsinnig, da du ja bei RegisterHotkey dem Hotkey die ID 1 gegeben hast.

Ein "If wParam = 1 Then" reicht also.

@Dusky_Joe: Du musst genauer lesen.

In der win32.hlp steht:

win32.hlp hat Folgendes geschrieben:
An application must specify a value in the range 0x0000 through 0xBFFF. A shared dynamic-link library (DLL) must specify a value in the range 0xC000 through 0xFFFF (the range returned by the GlobalAddAtom function).


Ich geh mal davon aus, dass du keine DLL sondern eine EXE ("an application") erzeugt hast, daher musst du einen Zahlwert zwischen 0 und &hBFFF als ID angeben.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 19.10.2010, 17:46    Titel: Antworten mit Zitat

Vielen Dank volta für die schnelle AW!

Habe inzwischen gesehen, wo mein Fehler lag: Ich habe einfach den Wert von hWnd falsch übergeben! Und wenn man den Hotkey für's handle 0 einträgt, passiert natürlich nichts...
Anyway:
Sehe ich das richtig, das du an sich denselben Weg gehst, nur ohne die Registrierung eines GlobalAtoms? Ist es dann nicht gefährlich, dass man als Hotkey-Identifier eine bereits vergebene ID benutzt?

Und...
Da sieht man's wieder mal, die BIs muss man mal kennen! Wusste gar nicht, dass die Virtual Keycodes Konstanten haben! Man hätte zwar davon ausgehen können, aber...
Und ich bin auch schon so eingerostet, dass ich nicht mal mehr wusste, dass es eine FB-Eigene Funktion gibt, um das handle des GfxWin zu bekommen... naja, wird sich vermutlich bessern, jetzt wo ich wieder halbwegs regelmäßig zum Coden komme...

@all:
Besteht Interesse daran, dass ich das Programm hochlade? Ich nehme an, dass es solche Multislot-Clipboards wie Sand am Meer gibt, aber wenn jemand trotzdem Interesse an dieser V1.1 hat, ...
Bisher ist das Ding nur Kompatibel mit Strings, für die 1.2 hab ich mir aber vorgenommen, auch eine ImgControl einzubauen.
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 19.10.2010, 18:30    Titel: Antworten mit Zitat

Das mit den Bildern ist ja nicht schwer, weil du ja mit EnumClipboardFormats erfahren kannst, was alles im Clipboard ist. Was das ist, ist dann ja egal. Binäre Daten halt.

Wegen Hotkey-ID: Nachdem ich davon ausgehe, dass das dein Programm ist, wird wohl kein anderer diese ID nehmen in dem Thread wo dein Fenster angezeigt wird happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 19.10.2010, 18:41    Titel: Antworten mit Zitat

Aber es ist doch ein Globaler Hotkey, oder nicht? Ich meine, wenn ich jetzt ein Programm A schreibe, das einen beliebige Tastenkombi unter der ID 1 registriert, kann dann nicht ein Programm B versuchen, eine andere Kombi auch unter 1 einzutragen? Die ID, die ich RegisterHotkey als zweiten Parameter übergebe wird ja auch für UnregisterHotkey benutzt. Daher dachte ich, die ID müsste Systemweit einheitlich sein. Oder hat tatsächlich jeder Thread seine Eigene Hotkey-Liste?

Sicher, die Bilder sind keine große Sache mehr, jetzt wo der Rest steht. Tipparbeit halt...
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 19.10.2010, 19:42    Titel: Antworten mit Zitat

@Cherry,
hast recht, "If wParam = 1 Then" reicht!

@Dusky_Joe
Zitat:
..kann dann nicht ein Programm B versuchen, eine andere Kombi auch unter 1 einzutragen?
versuchen schon aber RegisterHotKey sollte dann 0 return senden. Also das müsste man dann auch prüfen.
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 19.10.2010, 21:06    Titel: Antworten mit Zitat

Hm, gut, aber bevor ich das Ergebnis von RegisterHotkey überprüfe, und dann meine ID immer wieder inkrementiere, bis es mal passt, lass ich mir lieber gleich einen eindeutigen Bezeichner via GlobalAddAtom geben lächeln

Alors, merci beaucoup, tout le monde!
Des salutations de Montpellier en France! Je vous souhaite une bonne soirée!


Have a nice day
Ciao
Dusky_Joe
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 20.10.2010, 20:11    Titel: Antworten mit Zitat

Ich glaube, das stimmt nicht!

Jeder Thread hat seine eigenen Hotkey-IDs. Dass der Hotkey global ist, bedeutet nur, dass er systemweit aufgerufen werden kann.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz