Skip to content

Instantly share code, notes, and snippets.

@ewauq
Last active April 2, 2026 16:40
Show Gist options
  • Select an option

  • Save ewauq/2702c6b2342517a0ec9206fa101d3d7c to your computer and use it in GitHub Desktop.

Select an option

Save ewauq/2702c6b2342517a0ec9206fa101d3d7c to your computer and use it in GitHub Desktop.
How to: Bind F13 to F24 keys on the G-keys (Logitech Gaming Keyboards)
-- How to use this script:
-- 1. Install the Logitech Gaming Software: http://support.logitech.com/en_us/software/lgs
-- 2. Launch it, and right click on your profile (the gear icon) and then click on "Scripts".
-- 3. Add the following code into the Script window, save it, and close it. Enjoy.
-- Now G1 is bound to F13, G2 to G14, ... G12 to F24.
function OnEvent(event, arg)
-- OutputLogMessage("event = %s, arg = %s\n", event, arg)
fKey = {
[1] = 0x64, -- F13
[2] = 0x65, -- F14
[3] = 0x66, -- F15
[4] = 0x67, -- F16
[5] = 0x68, -- F17
[6] = 0x69, -- F18
[7] = 0x6A, -- F19
[8] = 0x6B, -- F20
[9] = 0x6C, -- F21
[10] = 0x6D, -- F22
[11] = 0x6E, -- F23
[12] = 0x76 -- F24
}
if (event == "G_PRESSED") then
PressKey(fKey[arg])
end
if (event == "G_RELEASED") then
ReleaseKey(fKey[arg])
end
end
@DerekZiemba
Copy link
Copy Markdown

WEW!! I GOT IT WORKING.
The trick was to use a Hardware Profile burned into the mouse.

g700s-FKeys.dat

Placed in %LOCALAPPDATA%\Logitech\Logitech Gaming Software\Logitech Gaming Software\On-Board Profiles\G700s\g700s-FKeys.dat

<?xml version="1.0" encoding="utf-8"?>
<obprofiles xmlns="http://www.logitech.com/Cassandra/2013.1/OnboardProfile">
  <profile name="g700s-FKeys">
    <device powermode="3" buttoncount="13" model="Logitech.Gaming.Mouse.G700s" reportrate="1000" anglesnapping="0">
      <dpitable defaultindex="0">
        <dpi x="1600" y="1600"/>
        <dpi x="0" y="0"/>
        <dpi x="0" y="0"/>
        <dpi x="0" y="0"/>
        <dpi x="0" y="0"/>
      </dpitable>
    </device>
    <buttons>
      <button number="1" name="Left Click">
        <mousefunction xmlns="http://www.logitech.com/Cassandra/2010.1/Macros/MouseFunction">
          <do task="leftclick"/>
        </mousefunction>
      </button>
      <button number="2" name="Right Click">
        <mousefunction xmlns="http://www.logitech.com/Cassandra/2010.1/Macros/MouseFunction">
          <do task="rightclick"/>
        </mousefunction>
      </button>
      <button number="3" name="Middle Click">
        <mousefunction xmlns="http://www.logitech.com/Cassandra/2010.1/Macros/MouseFunction">
          <do task="middleclick"/>
        </mousefunction>
      </button>
      <button number="4" name="Back">
        <mousefunction xmlns="http://www.logitech.com/Cassandra/2010.1/Macros/MouseFunction">
          <do task="back"/>
        </mousefunction>
      </button>
      <button number="5" name="Dismiss">
        <!--  Implemented via Autohotkey:
        - If popup or dialog window has a preselected button matching text  
          `(OK|Accept|Next|Submit|Continue|Enter|Dismiss|Cancel|Close|Abort)` send the '{ENTER}' key, 
          else send '{ESCAPE}' key
        - If tabs detected, send Ctrl+W to close the tab
        - Otherwise send close window message to the active window
         -->
        <keystroke xmlns="http://www.logitech.com/Cassandra/2010.1/Macros/Keystroke">
          <key value="F19" />
        </keystroke>
      </button>
      <button number="6" name="Forward">
        <mousefunction xmlns="http://www.logitech.com/Cassandra/2010.1/Macros/MouseFunction">
          <do task="forward"/>
        </mousefunction>
      </button>
      <button number="7" name="CycleLeft Window Positions">
        <!-- Implemented via DisplayFusion -->
        <keystroke xmlns="http://www.logitech.com/Cassandra/2010.1/Macros/Keystroke">
          <key value="F20" />
        </keystroke>
      </button>
      <button number="8" name="NextTab/TabRight or PageDown">
         <!-- Implemented via Autohotkey that detects when windows have tabs -->
        <keystroke xmlns="http://www.logitech.com/Cassandra/2010.1/Macros/Keystroke">
          <key value="F21" />
        </keystroke>
      </button>
      <button number="9" name="PriorTab/TabLeft or PageUp">
        <!-- Implemented via Autohotkey that detects when windows have tabs -->
        <keystroke xmlns="http://www.logitech.com/Cassandra/2010.1/Macros/Keystroke">
          <key value="F22" />
        </keystroke>
      </button>
      <button number="10" name="CycleRight Window Positions">
        <!-- Implemented via DisplayFusion -->
        <keystroke xmlns="http://www.logitech.com/Cassandra/2010.1/Macros/Keystroke">
          <key value="F23" />
        </keystroke>
      </button>
      <button number="11" name="Cycle Window Size">
        <!-- Implemented via DisplayFusion -->
        <keystroke xmlns="http://www.logitech.com/Cassandra/2010.1/Macros/Keystroke">
          <key value="F24" />
        </keystroke>
      </button>
      <button number="12" name="Scroll Left">
        <mousefunction xmlns="http://www.logitech.com/Cassandra/2010.1/Macros/MouseFunction">
          <do task="scrollleft"/>
        </mousefunction>
      </button>
      <button number="13" name="Scroll Right">
        <mousefunction xmlns="http://www.logitech.com/Cassandra/2010.1/Macros/MouseFunction">
          <do task="scrollright"/>
        </mousefunction>
      </button>
    </buttons>
  </profile>
</obprofiles>

@AeliusAlias
Copy link
Copy Markdown

AeliusAlias commented Apr 2, 2026

None of this worked on my G700s mouse. I did the following script to test ALL the keys, nothing worked.

BTW you can pass the keys as a string. Can just do "F19" for example. If the string is invalid, it'll throw an actual error. Just because it's valid though doesn't mean it'll do anything.

counter = 0
function OnEvent(event, arg)
  -- ## Microsoft's actual standard VKEY codes 
  -- keymap = {
  --   [5]  = 0x82, -- F19
  --   [7]  = 0x83, -- F20
  --   [8]  = 0x84, -- F21
  --   [9]  = 0x85, -- F22
  --   [10] = 0x86, -- F23
  --   [11] = 0x87  -- F24
  -- }

  -- ## The codes mentioned on https://gist.github.com/ewauq/2702c6b2342517a0ec9206fa101d3d7c
  -- local keymap = {
  --   [5]  = 106, -- F19
  --   [7]  = 107, -- F20
  --   [8]  = 108, -- F21
  --   [9]  = 109, -- F22
  --   [10] = 110, -- F23
  --   [11] = 118  -- F24
  -- }

  -- You can apparently pass the key as a string
  local keymap = {
    [5]  = "F19", -- F19
    [7]  = "F20", -- F20
    [8]  = "F21", -- F21
    [9]  = "F22", -- F22
    [10] = "F23", -- F23
    [11] = "F24"  -- F24
  }

  if arg == 11 then   
    counter = counter + 1
    if event == "MOUSE_BUTTON_PRESSED" then
      OutputLogMessage("TEST KeyDN: %s mapto: %i \t0x%X \n", arg, counter, counter) 
      PressKey(counter)
    elseif event == "MOUSE_BUTTON_RELEASED" then
      OutputLogMessage("TEST KeyUP: %s mapto: %i \t0x%X \n", arg, counter, counter) 
      ReleaseKey(counter)
    end
  else
    local keyval = keymap[arg]
    if keyval then   
      if event == "MOUSE_BUTTON_PRESSED" then
        -- OutputLogMessage("KeyDN: %s mapto: %i \t0x%X \n", arg, keyval, keyval) 
        OutputLogMessage("KeyDN: %s mapto: %s\n", arg, keyval) 
        PressKey(keyval)
      elseif event == "MOUSE_BUTTON_RELEASED" then
        -- OutputLogMessage("KeyUP: %s mapto: %i \t0x%X \n", arg, keyval, keyval) 
        OutputLogMessage("KeyUP: %s mapto: %s\n", arg, keyval) 
        ReleaseKey(keyval)
      end
    end
  end
end
  • Invalid Keys (these throw an exception):
    85,89-92,94-99,111,113,114,116,117,122,124,127-240,253-271,273-280,282-287,291,293-301,303,305,307,308,310,313-324,330,332,334,340-346,350-363,366-872
    I got tired of clicking at 872.

  • Key combinations that don't throw an exception (but nothing special happens)
    86-88,93,100-110,112,115,118-121,123,125,126,241-252,272,281,284,285,288-290,292,302,304,306,309,311,312,325-329, 331,333,335-339,347-349,364-365

    • None of the valid keys ever pressed a keyboard key or Fkey.

      • KeyboardStateView never registered keypress's beyond some media keys, VK_LAUNCH_APP, VK_OEM_4, VK_OEM6, and VK_OEM2
      • VSCode's "Keyboard Shortcuts" menu with Search by key or Record Keys never picked anything up
  • Notes:

    • 288-290: One of these keys opened Calculator / VK_LAUNCH_APP2
    • 364-365: One of thse opened Media Player / VK_LAUNCH_MEDIA_SELECT

Should of tried my code, which uses the hex code to get the keys:

-- How to use this script:
-- 1. Install the Logitech Gaming Software: http://support.logitech.com/en_us/software/lgs
-- 2. Launch it, and right click on your profile (the gear icon) and then click on "Scripts".
-- 3. Add the following code into the Script window, save it, and close it. Enjoy.
-- Now G9 on your G600 mouse is bound to F13, G10 to G14, ... G12 to F24.

function OnEvent(event, arg)
    -- Enable logging
    EnablePrimaryMouseButtonEvents(true)

    -- Table mapping mouse button numbers to F-key hex codes
    local fKeys = {
        [9] = 0x64,  -- F13
        [10] = 0x65, -- F14
        [11] = 0x66, -- F15
        [12] = 0x67, -- F16
        [13] = 0x68, -- F17
        [14] = 0x69, -- F18
        [15] = 0x6A, -- F19
        [16] = 0x6B, -- F20
        [17] = 0x6C, -- F21
        [18] = 0x6D, -- F22
        [19] = 0x6E, -- F23
        [20] = 0x76, -- F24
    }

    -- Debug function to get F-key name from hex code
    local function getFKeyName(hexCode)
        for i, code in pairs(fKeys) do
            if code == hexCode then
                return "F" .. (i + 4)  -- Adjusted to start from F13
            end
        end
        return "Unknown"
    end

    -- Function to handle key press and release
    local function handleKey(keyAction)
        if fKeys[arg] then
            local fKeyHex = fKeys[arg]
            local fKeyName = getFKeyName(fKeyHex)
            local actionName = keyAction == PressKey and "Pressing" or "Releasing"
            
            OutputLogMessage("Mouse button %d: %s %s (Hex: 0x%02X)\n", arg, actionName, fKeyName, fKeyHex)
            keyAction(fKeyHex)
        else
            OutputLogMessage("Unhandled mouse button: %d\n", arg)
        end
    end

    OutputLogMessage("Event: %s, Arg: %d\n", event, arg)

    if event == "MOUSE_BUTTON_PRESSED" then
        handleKey(PressKey)
    elseif event == "MOUSE_BUTTON_RELEASED" then
        handleKey(ReleaseKey)
    end
end

In your case, you would adapt the code to be as such due the lower number of buttons:

-- How to use this script:
-- 1. Install the Logitech Gaming Software: http://support.logitech.com/en_us/software/lgs
-- 2. Launch it, and right click on your profile (the gear icon) and then click on "Scripts".
-- 3. Add the following code into the Script window, save it, and close it. Enjoy.
-- Now G4 on your G700 mouse is bound to F13, G5 to F14, ... G11 to F20.

function OnEvent(event, arg)
    EnablePrimaryMouseButtonEvents(true)

    -- Table mapping G700 button numbers to F-key hex codes
    -- G700 has buttons G4–G11 (8 programmable buttons)
    local fKeys = {
        [4]  = 0x64, -- F13
        [5]  = 0x65, -- F14
        [6]  = 0x66, -- F15
        [7]  = 0x67, -- F16
        [8]  = 0x68, -- F17
        [9]  = 0x69, -- F18
        [10] = 0x6A, -- F19
        [11] = 0x6B, -- F20
    }

    local function getFKeyName(hexCode)
        for i, code in pairs(fKeys) do
            if code == hexCode then
                return "F" .. (i + 9) -- G4 → F13, G5 → F14, etc.
            end
        end
        return "Unknown"
    end

    local function handleKey(keyAction)
        if fKeys[arg] then
            local fKeyHex = fKeys[arg]
            local fKeyName = getFKeyName(fKeyHex)
            local actionName = keyAction == PressKey and "Pressing" or "Releasing"

            OutputLogMessage("Mouse button %d: %s %s (Hex: 0x%02X)\n", arg, actionName, fKeyName, fKeyHex)
            keyAction(fKeyHex)
        else
            OutputLogMessage("Unhandled mouse button: %d\n", arg)
        end
    end

    OutputLogMessage("Event: %s, Arg: %d\n", event, arg)

    if event == "MOUSE_BUTTON_PRESSED" then
        handleKey(PressKey)
    elseif event == "MOUSE_BUTTON_RELEASED" then
        handleKey(ReleaseKey)
    end
end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment