Page 1 sur 1

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

Publié : jeu. 04/avr./2019 13:17
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

Re: Question: intercepter le clic droit sur un WebGadget

Publié : jeu. 04/avr./2019 17:06
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

Re: Question: intercepter le clic droit sur un WebGadget

Publié : jeu. 04/avr./2019 17:40
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

Re: Question: intercepter le clic droit sur un WebGadget

Publié : jeu. 04/avr./2019 18:38
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

Re: Question: intercepter le clic droit sur un WebGadget

Publié : jeu. 04/avr./2019 20:17
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.

Re: Question: intercepter le clic droit sur un WebGadget

Publié : ven. 05/avr./2019 10:13
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

Re: Question: intercepter le clic droit sur un WebGadget

Publié : ven. 05/avr./2019 16:14
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.

Re: Question: intercepter le clic droit sur un WebGadget

Publié : ven. 05/avr./2019 16:51
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...

Re: Question: intercepter le clic droit sur un WebGadget

Publié : ven. 05/avr./2019 21:28
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