Also make the concommand.add in the shared file where the function is created (inside the Client bit.) All you're doing is adding an empty console command as you're adding it on the server and your function starts with if( CLIENT ) so the server sees it as:

hook.Add("Think","CheckKeys",function()
if input.IsKeyDown(65) then LocalPlayer():ChatPrint("You pressed space!") end
end)

However, one problem is that even if you press the key rather quickly, because this hook runs every tick or so it's very likely that you'll get "You pressed space!" 3 or 4 times. For example, I made a function that detects the numpad, so to avoid this issue I did:

local keys = {
{38,1},
{39,2},
{40,3},
{41,4},
{42,5},
{43,6},
{44,7},
{45,8},
{46,9},
}
local keypressed = false
hook.Add("Think","ExpKeys",function()
for _,v in ipairs(keys) do if input.IsKeyDown(v[1]) then
if keypressed == false then RunConsoleCommand("exp_useskill",v[2])
keypressed = true
timer.Destroy("Key")
else if not timer.IsTimer("Key") then timer.Create("Key",0.25,1,function() keypressed = false end) end
end
end end
end)

Ok, here's how it goes. The following hooks:
KeyPress
KeyDown
KeyRelease

These hooks only run when an IN_KEY is pressed. IN_KEYS are various functions for use in the default HL2 keyboard, like walking, firing, and sprinting.

However, these hooks do not detect any other keys, which is pretty much the whole keyboard and numpad. Yet there is a function that can do this, but the unfortunate thing is it can only be called on the client; the answer is input.IsKeyDown().

Thus, the only way to detect if a key that's not an IN_KEY is to use input.IsKeyDown in a Think hook (think basically just runs a lot). Refer to the code in my previous post on this.