Question: intercepter le clic droit sur un WebGadget [OK]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Question: intercepter le clic droit sur un WebGadget [OK]

Message par cage »

Bonjour a tous,

La question est dans le titre.
Je cherche désespéramment a intercepter le clic droit sur un WebGadget.
J'ai essayé avec GetKeyState_(#VK_RBUTTON) et GetAsyncKeyState_(#VK_RBUTTON)
mais l'interception est globale quelle que soit l'application ou on fait clic droit, même le bureau.
Je cherche l'équivalent, mais uniquement pour mon application.
Auriez vous une solution a me proposer.
Merci a vous.
CAGE
Dernière modification par cage le ven. 05/avr./2019 21:31, modifié 1 fois.
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Question: intercepter le clic droit sur un WebGadget

Message par cage »

Pour étayer ma demande, voici un bout de code qui illustre le problème.
La fenêtre comprend un Button, un WebGadget et une StatusBar
Les trois sont affichés et le menu Popup n'apparait que si on clique droit sur la partie au dessus ou au dessous du WebGadget, y compris la StatusBar
Si on fait disparaitre le WebGadget en cliquant sur le bouton, le clic droit fonctionne sur toute la fenêtre.
Le clic droit fonctionne aussi sur l'icône de systray.
L'icône est disponible ici

Code : Tout sélectionner

EnableExplicit

Declare appAbout()
Declare appHelp()

#winMain = 100
#bgcolor = 14474460 ; bgcolor = RGB(220,220,220) ; $00DCDCDC
Enumeration Menus
  #menuMain
  #menuTray
  #menuPopup
EndEnumeration

Enumeration FormMenus
  #about
  #quit
  #help
EndEnumeration

Enumeration Gadgets
  #btn
  #web
  #status
  #canvas
EndEnumeration

DataSection;Images
  Image_App:
  IncludeBinary "windows.ico"
EndDataSection

Enumeration Images
  #Image_App
EndEnumeration

Global IconApp = CatchImage(#Image_App, ?Image_App)

ExamineDesktops()
#appWidth  = 800
#appHeight = 600
Define X = (DesktopWidth(0)-#appWidth)/2
Define Y = (DesktopHeight(0)-#appHeight)/2

Define Titre$ = "Bonjour a tous - Question: comment intercepter le clic droit sur un WebGadget"
Define Flags = #PB_Window_TitleBar|#PB_Window_ScreenCentered|#PB_Window_SystemMenu

If OpenWindow(#winMain, X, Y, #appWidth, #appHeight, Titre$, Flags)
  CanvasGadget(#canvas, 0, 0, #appWidth, #appWidth, #PB_Canvas_Container)
  StartDrawing(CanvasOutput(#canvas))
    FillArea(0, 0, -1,#bgcolor)
  StopDrawing()
  
  ButtonGadget(#btn, 3, 3, 250, 25, "Afficher/MAsquer le WebGadget")
  SetGadgetData(#btn, #True)
  
  ;; sans le WebGadget, le menu PopUp fonctionne sur toute la fenêtre
  WebGadget (#web, 0, 100, #appWidth, 400, "purebasic.fr")
  SetGadgetData(#web, #False)
  
  CreateStatusBar(#status, WindowID(#winMain))
  AddStatusBarField(#PB_Ignore)
  CloseGadgetList()
  
  AddSysTrayIcon(#winMain, WindowID(#winMain), IconApp)
  
  If CreatePopupMenu(#menuPopup)
    MenuItem(#help  , "Aide"+Chr(9)+"F1")
    MenuItem(#about , "A propos de l'application"+Chr(9)+"F2")
    MenuBar()
    MenuItem(#quit  , "Quitter"+Chr(9)+"Ctrl+Q")
  EndIf
  
  Define Event
  
  Repeat
    Event = WaitWindowEvent(20)
; ;     If Event = #PB_EventType_RightClick
; ;     If GetKeyState_(#VK_RBUTTON)
;     If GetAsyncKeyState_(#VK_RBUTTON)
;       DisplayPopupMenu(#menuPopup, WindowID(#winMain))
;     EndIf
    Select Event
;---- Events MENUS
      Case #PB_Event_Menu
        Select EventMenu()
          Case #about
            appAbout()
          Case #help
            appHelp()
          Case #quit
            Break
        EndSelect
;---- Events GADGETS
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #btn
          SetGadgetData(#web, Bool(GetGadgetData(#web) = 0))
          HideGadget(#web, GetGadgetData(#web))
        EndSelect
        Select EventType()
          Case #PB_EventType_RightClick
            DisplayPopupMenu(#menuPopup, WindowID(#winMain))
        EndSelect
;---- Events SYSTRAY
      Case #PB_Event_SysTray
        Select EventType()
          Case #PB_EventType_RightClick
            DisplayPopupMenu(#menuPopup, WindowID(#winMain))
        EndSelect
;---- Events SYSTEM WINDOW
      Case #PB_Event_CloseWindow
        Break
    EndSelect
  ForEver
EndIf

Procedure appHelp()
  Debug "Procédure appHelp()"
EndProcedure

Procedure appAbout()
  Debug "Procédure appAbout()"
EndProcedure

End
Merci pour toute l'aide que vous pourrez m'apporter.
CAGE
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Question: intercepter le clic droit sur un WebGadget

Message par falsam »

Vieux code remis au gout du jour

Code : Tout sélectionner

Declare Start()
Declare onRightClick(nCode,wParam,lParam)
Declare onSelectItem()
Declare Exit()

Start()

Procedure Start()
  OpenWindow(0, 0, 0, 800, 600, "Disable browser right click menu", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  ;Disable the window (browser gadget) right click menu
  hInstance=GetModuleHandle_(0)
  lpdwProcessId=GetWindowThreadProcessId_(WindowID(0),0)
  SetWindowsHookEx_(#WH_MOUSE,@onRightClick(), hInstance, lpdwProcessId)
  
  WebGadget(1,0,0,800,600,"http://www.purebasic.com")
  
  CreatePopupMenu(0)
  MenuItem(1,"Open")
  MenuItem(2,"Save")
  MenuItem(3,"Exit")
  
  ;Déclencheur
  BindEvent(#PB_Event_Menu, @onSelectItem())
  BindEvent(#PB_Event_CloseWindow, @Exit())
   
  Repeat : WaitWindowEvent() : ForEver
EndProcedure

Procedure onRightClick(nCode,wParam,lParam)
  If wParam=#WM_RBUTTONDOWN
    DisplayPopupMenu(0,WindowID(0))
    ProcedureReturn 1
  EndIf
  ProcedureReturn 0
EndProcedure

Procedure onSelectItem()
  Select EventMenu()
    Case 1
      Debug "Open"
      
    Case 2
      Debug "Save"
    Case 3
      Debug "Exit"
      Exit()
  EndSelect  
EndProcedure

Procedure Exit()
  End  
EndProcedure
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Question: intercepter le clic droit sur un WebGadget

Message par cage »

Un grand merci falsam, cela fonctionne maintenant comme je le voulais.

Il y a quand même des gens bien dans le forum France.

CAGE
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Question: intercepter le clic droit sur un WebGadget

Message par Ollivier »

Il y a un code plus général si ta demande varie à l'avenir. Il n'est pas à jour. Le titre c'est le << couteau suisse de Chris >>. Un gars bien qui me suggérait de m'enfiler par mes propres moyens du beurre du Poitou dans le rectum il y a huit ans. J'atteste que je ne lui en tiens pas rigueur, et qu'il s'agissait d'une figure élaborée de style à situation politique.

Mais son couteau suisse dont, il me semble, Chris indique l'origine, permettait de dicerner les différents handles de zones graphiques pointées par la souris avec handles d'apparenté, le tout sous Windows uniquement.
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Question: intercepter le clic droit sur un WebGadget

Message par cage »

Bonjour Ollivier,

J'ai bien trouvé le code (du moins je crois), mais il me sort un erreur.

Code : Tout sélectionner

  Repeat 
    GetCursorPos_(CurPos)
    HObjet = WindowFromPoint_(CurPos\x, CurPos\y) ; <-- Line 105: WindowFromPoint_(): Incorrect number of parameters.
The WindowFromPoint function retrieves the handle of the window that contains the specified point.

HWND WindowFromPoint(
POINT Point // structure with point
);

Parameters

Point

Specifies a POINT structure that defines the point to be checked.
Ce code commence a dater.
Merci quand même.
CAGE
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Question: intercepter le clic droit sur un WebGadget

Message par Ollivier »

Bonjour CaGe,

au vu de l'erreur mentionnée et, si mes souvenirs sont bons, c'est, il me semble, une modification de la fonction API, par Microsoft, une mise à jour.

Soit la fonction existe sous une autre forme :

Code : Tout sélectionner

; ancienne forme
Result = WindowFromPoint_(x, y)

; nouvelle forme
Define Coord.POINT
Coord\x = x
Coord\y = y
Result = WindowFromPoint_(Coord)
Soit la fonction n'est plus disponible. Auquel cas, une aide en ligne a indiqué durant quelques années, la manière de la remplacer. Et je n'ai pas suivi cette mise à jour.

Soit, cas moins probable, la fonction n'est plus disponible définitivement.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Question: intercepter le clic droit sur un WebGadget

Message par Ollivier »

Ça semble être le 3ème cas :

https://docs.microsoft.com/en-us/window ... wfrompoint

Code : Tout sélectionner

Define Co.POINT
Co\x = x
Co\y = y
Handle = WindowFromPoint_(Co)
En espérant que ça fonctionne.

Il y a aussi une commande dans la page URL donnée ci-dessus : ChildWindowFromPoint_(...) qui est l'apparenté "descendant". Peut-être une piste pour décomposer aussi ce qui est dans la page Web en différents handles. A suivre...
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Question: intercepter le clic droit sur un WebGadget

Message par cage »

Bonsoir,
Le problème étant résolu, je poste ci-dessous le code qui fonctioone

Code : Tout sélectionner

EnableExplicit

Declare appAbout()
Declare appHelp()
Declare onMouse(nCode,wParam,lParam)

#winMain = 100
#bgcolor = 14474460 ; bgcolor = RGB(220,220,220) ; $00DCDCDC
Enumeration Menus
  #menuMain
  #menuTray
  #menuPopup
EndEnumeration

Enumeration FormMenus
  #about
  #quit
  #help
EndEnumeration

Enumeration Gadgets
  #btn
  #web
  #status
  #canvas
EndEnumeration

DataSection;Images
  Image_App:
  IncludeBinary "windows.ico"
EndDataSection

Enumeration Images
  #Image_App
EndEnumeration

Global IconApp = CatchImage(#Image_App, ?Image_App)

ExamineDesktops()
#appWidth  = 800
#appHeight = 600
Define X = (DesktopWidth(0)-#appWidth)/2
Define Y = (DesktopHeight(0)-#appHeight)/2

Define Titre$ = "Bonjour a tous - Question: comment intercepter le clic droit sur un WebGadget"
Define Flags = #PB_Window_TitleBar|#PB_Window_ScreenCentered|#PB_Window_SystemMenu

If OpenWindow(#winMain, X, Y, #appWidth, #appHeight, Titre$, Flags)
  CanvasGadget(#canvas, 0, 0, #appWidth, #appWidth, #PB_Canvas_Container)
  StartDrawing(CanvasOutput(#canvas))
    FillArea(0, 0, -1,#bgcolor)
  StopDrawing()
 
  ButtonGadget(#btn, 3, 3, 250, 25, "Afficher/MAsquer le WebGadget")
  SetGadgetData(#btn, #True)
 
  ;; sans le WebGadget, le menu PopUp fonctionne sur toute la fenêtre
  WebGadget (#web, 0, 100, #appWidth, 400, "purebasic.fr")
  SetGadgetData(#web, #False)
 
  CreateStatusBar(#status, WindowID(#winMain))
  AddStatusBarField(#PB_Ignore)
  CloseGadgetList()
 
  AddSysTrayIcon(#winMain, WindowID(#winMain), IconApp)
 
  If CreatePopupMenu(#menuPopup)
    MenuItem(#help  , "Aide"+Chr(9)+"F1")
    MenuItem(#about , "A propos de l'application"+Chr(9)+"F2")
    MenuBar()
    MenuItem(#quit  , "Quitter"+Chr(9)+"Ctrl+Q")
  EndIf
 
  Define hInstance=GetModuleHandle_(0)
  Define lpdwProcessId=GetWindowThreadProcessId_(WindowID(#winMain),0)
  SetWindowsHookEx_(#WH_MOUSE, @onMouse(), hInstance, lpdwProcessId)
  
  Define Event
 
  Repeat
    Event = WaitWindowEvent(20)
    Select Event
;---- Events MENUS
      Case #PB_Event_Menu
        Select EventMenu()
          Case #about
            appAbout()
          Case #help
            appHelp()
          Case #quit
            Break
        EndSelect
;---- Events GADGETS
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #btn
          SetGadgetData(#web, Bool(GetGadgetData(#web) = 0))
          HideGadget(#web, GetGadgetData(#web))
        EndSelect
        Select EventType()
          Case #PB_EventType_RightClick
            DisplayPopupMenu(#menuPopup, WindowID(#winMain))
        EndSelect
;---- Events SYSTRAY
      Case #PB_Event_SysTray
        Select EventType()
          Case #PB_EventType_RightClick
            DisplayPopupMenu(#menuPopup, WindowID(#winMain))
        EndSelect
;---- Events SYSTEM WINDOW
      Case #PB_Event_CloseWindow
        Break
    EndSelect
  ForEver
EndIf

Procedure onMouse(nCode,wParam,lParam)
  Select wParam
    Case #WM_RBUTTONDOWN
      DisplayPopupMenu(#menuPopup,WindowID(#winMain))
      Debug "onMouse=RIGHT_BUTTON_DOWN"
      ProcedureReturn 1
    Case #WM_LBUTTONDOWN
      Debug "onMouse=LEFT_BUTTON_DOWN"
  EndSelect
  ProcedureReturn 0
EndProcedure

Procedure appHelp()
  Debug "Procédure appHelp()"
EndProcedure

Procedure appAbout()
  Debug "Procédure appAbout()"
EndProcedure

End
Merci pour votre aide précieuse.
CAGE
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Répondre