2017-09-29 10 views
1

OS를 SetWindowsHookEx 절차를 찾지 못했습니다. 관리자 prividge와 함께 실행하려고했지만 여전히 작동하지 않습니다. 내가 링크 다음 참조은 USER32.DLL에

,

https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx

panic: Failed to find SetWindowsHookEx procedure in user32.dll: The specified procedure could not be found. 
goroutine 1 [running]: 
panic(0x4a7980, 0xc04206c3f0) 
    C:/Go/src/runtime/panic.go:500 +0x1af 
golang.org/x/sys/windows.(*LazyProc).mustFind(0xc04206c240) 
    D:/repos/src/golang.org/x/sys/windows/dll_windows.go:286 +0x71 
golang.org/x/sys/windows.(*LazyProc).Call(0xc04206c240, 0xc04203e480, 0x4, 0x4, 0xc042036058, 0x0, 0xc04206c360, 0xc04202def8) 
    D:/repos/src/golang.org/x/sys/windows/dll_windows.go:307 +0x36 
main.SetWindowsHookEx(0xd, 0x4cab20, 0x0, 0xc000000000, 0x4bfe15) 
    d:/repos/src/github.com/quchunguang/trygo/demos/demo_windows_hook/main.go:85 +0xac 
main.Start() 
    d:/repos/src/github.com/quchunguang/trygo/demos/demo_windows_hook/main.go:147 +0x52 
main.main() 
    d:/repos/src/github.com/quchunguang/trygo/demos/demo_windows_hook/main.go:166 +0x1b 
exit status 2 
Process exiting with code: 1 

여기 내 코드

https://github.com/AllenDang/w32

.

package main 

import (
    "fmt" 
    "syscall" 
    //~ "time" 
    "unsafe" 

    "golang.org/x/sys/windows" 
) 

// String returns a human-friendly display name of the hotkey 
// such as "Hotkey[Id: 1, Alt+Ctrl+O]" 
var (
    user32     = windows.NewLazySystemDLL("user32.dll") 
    procSetWindowsHookEx = user32.NewProc("SetWindowsHookEx") 
    procLowLevelKeyboard = user32.NewProc("LowLevelKeyboardProc") 
    procCallNextHookEx  = user32.NewProc("CallNextHookEx") 
    procUnhookWindowsHookEx = user32.NewProc("UnhookWindowsHookEx") 
    procGetMessage   = user32.NewProc("GetMessageW") 
    procTranslateMessage = user32.NewProc("TranslateMessage") 
    procDispatchMessage  = user32.NewProc("DispatchMessageW") 
    keyboardHook   HHOOK 
) 

const (
    WH_KEYBOARD_LL = 13 
    WH_KEYBOARD = 2 
    WM_KEYDOWN  = 256 
    WM_SYSKEYDOWN = 260 
    WM_KEYUP  = 257 
    WM_SYSKEYUP = 261 
    WM_KEYFIRST = 256 
    WM_KEYLAST  = 264 
    PM_NOREMOVE = 0x000 
    PM_REMOVE  = 0x001 
    PM_NOYIELD  = 0x002 
    WM_LBUTTONDOWN = 513 
    WM_RBUTTONDOWN = 516 
    NULL   = 0 
) 

type (
    DWORD  uint32 
    WPARAM uintptr 
    LPARAM uintptr 
    LRESULT uintptr 
    HANDLE uintptr 
    HINSTANCE HANDLE 
    HHOOK  HANDLE 
    HWND  HANDLE 
) 

type HOOKPROC func(int, WPARAM, LPARAM) LRESULT 

type KBDLLHOOKSTRUCT struct { 
    VkCode  DWORD 
    ScanCode DWORD 
    Flags  DWORD 
    Time  DWORD 
    DwExtraInfo uintptr 
} 

// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162805.aspx 
type POINT struct { 
    X, Y int32 
} 

// http://msdn.microsoft.com/en-us/library/windows/desktop/ms644958.aspx 
type MSG struct { 
    Hwnd HWND 
    Message uint32 
    WParam uintptr 
    LParam uintptr 
    Time uint32 
    Pt  POINT 
} 

func SetWindowsHookEx(idHook int, lpfn HOOKPROC, hMod HINSTANCE, dwThreadId DWORD) HHOOK { 
    ret, _, _ := procSetWindowsHookEx.Call(
     uintptr(idHook), 
     uintptr(syscall.NewCallback(lpfn)), 
     uintptr(hMod), 
     uintptr(dwThreadId), 
    ) 
    return HHOOK(ret) 
} 

func CallNextHookEx(hhk HHOOK, nCode int, wParam WPARAM, lParam LPARAM) LRESULT { 
    ret, _, _ := procCallNextHookEx.Call(
     uintptr(hhk), 
     uintptr(nCode), 
     uintptr(wParam), 
     uintptr(lParam), 
    ) 
    return LRESULT(ret) 
} 

func UnhookWindowsHookEx(hhk HHOOK) bool { 
    ret, _, _ := procUnhookWindowsHookEx.Call(
     uintptr(hhk), 
    ) 
    return ret != 0 
} 

func GetMessage(msg *MSG, hwnd HWND, msgFilterMin uint32, msgFilterMax uint32) int { 
    ret, _, _ := procGetMessage.Call(
     uintptr(unsafe.Pointer(msg)), 
     uintptr(hwnd), 
     uintptr(msgFilterMin), 
     uintptr(msgFilterMax)) 
    return int(ret) 
} 

func TranslateMessage(msg *MSG) bool { 
    ret, _, _ := procTranslateMessage.Call(
     uintptr(unsafe.Pointer(msg))) 
    return ret != 0 
} 

func DispatchMessage(msg *MSG) uintptr { 
    ret, _, _ := procDispatchMessage.Call(
     uintptr(unsafe.Pointer(msg))) 
    return ret 
} 

func LowLevelKeyboardProc(nCode int, wParam WPARAM, lParam LPARAM) LRESULT { 
    ret, _, _ := procLowLevelKeyboard.Call(
     uintptr(nCode), 
     uintptr(wParam), 
     uintptr(lParam), 
    ) 
    return LRESULT(ret) 
} 

func Start() { 
    // defer user32.Release() 
    keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, 
     (HOOKPROC)(func(nCode int, wparam WPARAM, lparam LPARAM) LRESULT { 
      if nCode == 0 && wparam == WM_KEYDOWN { 
       fmt.Println("key pressed:") 
       kbdstruct := (*KBDLLHOOKSTRUCT)(unsafe.Pointer(lparam)) 
       code := byte(kbdstruct.VkCode) 
       fmt.Sprintf("%q", code) 
      } 
      return CallNextHookEx(keyboardHook, nCode, wparam, lparam) 
     }), 0, 0) 
    var msg MSG 
    for GetMessage(&msg, 0, 0, 0) != 0 { 

    } 
    //~ for { 
    //~ 
    //~ GetMessage(uintptr(unsafe.Pointer(msg)), 0, 0, 0) 
    //~ TranslateMessage(msg) 
    //~ DispatchMessage(msg) 
    //~ // fmt.Println("key pressed:") 
    //~ 
    //~ } 

    UnhookWindowsHookEx(keyboardHook) 
    keyboardHook = 0 
} 

func main() { 
    Start() 
} 
+2

그것은 "SetWindowsHookExW"입니다, GetMessageW 등으로 추가 W. 같은 생각을주의, 당신은 함수의 유니 코드 버전을 원한다. 다음 번에는 실패 할 것입니다. "LowLevelKeyboardProc"는 내 보낸 함수가 아니며 콜백 함수의 프로토 타입 일뿐입니다. 그냥 삭제하십시오. –

+0

고마워, 내 문제가 해결되었습니다. –

답변

0
package main 

import (
    "fmt" 
    "syscall" 
    "unsafe" 

    "golang.org/x/sys/windows" 
) 

// String returns a human-friendly display name of the hotkey 
// such as "Hotkey[Id: 1, Alt+Ctrl+O]" 
var (
    user32     = windows.NewLazySystemDLL("user32.dll") 
    procSetWindowsHookEx = user32.NewProc("SetWindowsHookExW") 
    procCallNextHookEx  = user32.NewProc("CallNextHookEx") 
    procUnhookWindowsHookEx = user32.NewProc("UnhookWindowsHookEx") 
    procGetMessage   = user32.NewProc("GetMessageW") 
    procTranslateMessage = user32.NewProc("TranslateMessage") 
    procDispatchMessage  = user32.NewProc("DispatchMessageW") 
    keyboardHook   HHOOK 
) 

const (
    WH_KEYBOARD_LL = 13 
    WH_KEYBOARD = 2 
    WM_KEYDOWN  = 256 
    WM_SYSKEYDOWN = 260 
    WM_KEYUP  = 257 
    WM_SYSKEYUP = 261 
    WM_KEYFIRST = 256 
    WM_KEYLAST  = 264 
    PM_NOREMOVE = 0x000 
    PM_REMOVE  = 0x001 
    PM_NOYIELD  = 0x002 
    WM_LBUTTONDOWN = 513 
    WM_RBUTTONDOWN = 516 
    NULL   = 0 
) 

type (
    DWORD  uint32 
    WPARAM uintptr 
    LPARAM uintptr 
    LRESULT uintptr 
    HANDLE uintptr 
    HINSTANCE HANDLE 
    HHOOK  HANDLE 
    HWND  HANDLE 
) 

type HOOKPROC func(int, WPARAM, LPARAM) LRESULT 

type KBDLLHOOKSTRUCT struct { 
    VkCode  DWORD 
    ScanCode DWORD 
    Flags  DWORD 
    Time  DWORD 
    DwExtraInfo uintptr 
} 

// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162805.aspx 
type POINT struct { 
    X, Y int32 
} 

// http://msdn.microsoft.com/en-us/library/windows/desktop/ms644958.aspx 
type MSG struct { 
    Hwnd HWND 
    Message uint32 
    WParam uintptr 
    LParam uintptr 
    Time uint32 
    Pt  POINT 
} 

func SetWindowsHookEx(idHook int, lpfn HOOKPROC, hMod HINSTANCE, dwThreadId DWORD) HHOOK { 
    ret, _, _ := procSetWindowsHookEx.Call(
     uintptr(idHook), 
     uintptr(syscall.NewCallback(lpfn)), 
     uintptr(hMod), 
     uintptr(dwThreadId), 
    ) 
    return HHOOK(ret) 
} 

func CallNextHookEx(hhk HHOOK, nCode int, wParam WPARAM, lParam LPARAM) LRESULT { 
    ret, _, _ := procCallNextHookEx.Call(
     uintptr(hhk), 
     uintptr(nCode), 
     uintptr(wParam), 
     uintptr(lParam), 
    ) 
    return LRESULT(ret) 
} 

func UnhookWindowsHookEx(hhk HHOOK) bool { 
    ret, _, _ := procUnhookWindowsHookEx.Call(
     uintptr(hhk), 
    ) 
    return ret != 0 
} 

func GetMessage(msg *MSG, hwnd HWND, msgFilterMin uint32, msgFilterMax uint32) int { 
    ret, _, _ := procGetMessage.Call(
     uintptr(unsafe.Pointer(msg)), 
     uintptr(hwnd), 
     uintptr(msgFilterMin), 
     uintptr(msgFilterMax)) 
    return int(ret) 
} 

func TranslateMessage(msg *MSG) bool { 
    ret, _, _ := procTranslateMessage.Call(
     uintptr(unsafe.Pointer(msg))) 
    return ret != 0 
} 

func DispatchMessage(msg *MSG) uintptr { 
    ret, _, _ := procDispatchMessage.Call(
     uintptr(unsafe.Pointer(msg))) 
    return ret 
} 

func Start() { 
    // defer user32.Release() 
    keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, 
     (HOOKPROC)(func(nCode int, wparam WPARAM, lparam LPARAM) LRESULT { 
      if nCode == 0 && wparam == WM_KEYDOWN { 
       fmt.Println("key pressed:") 
       kbdstruct := (*KBDLLHOOKSTRUCT)(unsafe.Pointer(lparam)) 
       code := rune(kbdstruct.VkCode) 
       fmt.Printf("%q", code) 
      } 
      return CallNextHookEx(keyboardHook, nCode, wparam, lparam) 
     }), 0, 0) 
    var msg MSG 
    for GetMessage(&msg, 0, 0, 0) != 0 { 
     // TranslateMessage(msg) 
     // DispatchMessage(msg) 
    } 

    UnhookWindowsHookEx(keyboardHook) 
    keyboardHook = 0 
} 

func main() { 
    Start() 
}