none
帮忙看看 注册热键的问题! RRS feed

  • 问题

  • // RegHotKey.cpp : 定义 DLL 的初始化例程。
    //

    #include "stdafx.h"
    #include "RegHotKey.h"

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif

    //
    //TODO: 如果此 DLL 相对于 MFC DLL 是动态链接的,
    //  则从此 DLL 导出的任何调入
    //  MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到
    //  该函数的最前面。
    //
    //  例如:
    //
    //  extern "C" BOOL PASCAL EXPORT ExportedFunction()
    //  {
    //   AFX_MANAGE_STATE(AfxGetStaticModuleState());
    //   // 此处为普通函数体
    //  }
    //
    //  此宏先于任何 MFC 调用
    //  出现在每个函数中十分重要。这意味着
    //  它必须作为函数中的第一个语句
    //  出现,甚至先于所有对象变量声明,
    //  这是因为它们的构造函数可能生成 MFC
    //  DLL 调用。
    //
    //  有关其他详细信息,
    //  请参阅 MFC 技术说明 33 和 58。
    //

    // CRegHotKeyApp

    BEGIN_MESSAGE_MAP(CRegHotKeyApp, CWinApp)
    END_MESSAGE_MAP()


    // CRegHotKeyApp 构造

    CRegHotKeyApp::CRegHotKeyApp()
    {
     // TODO: 在此处添加构造代码,
     // 将所有重要的初始化放置在 InitInstance 中
    }


    // 唯一的一个 CRegHotKeyApp 对象

    CRegHotKeyApp theApp;


    // CRegHotKeyApp 初始化

    BOOL CRegHotKeyApp::InitInstance()
    {
     CWinApp::InitInstance();

     return TRUE;
    }

    BOOL BoolRegHotkey;
    HWND W_Hwnd;
    int ID_HTK;

    extern "C" _declspec(dllexport) BOOL __stdcall RegHotKey(HWND Hwnd,int ID_HOTKEY,char Key)
    {
     if (RegisterHotKey(Hwnd,ID_HOTKEY,MOD_CONTROL|MOD_ALT,Key))
     {
      return true;
      W_Hwnd = Hwnd;
      BoolRegHotkey = true;
      ID_HTK = ID_HOTKEY;
     }
     return false;
     BoolRegHotkey = false;
    }

    extern "C" _declspec(dllexport) BOOL __stdcall UnHotKey(HWND Hwnd,int ID_HOTKEY)
    {
     if (UnregisterHotKey(Hwnd,ID_HOTKEY))
     {
      return true;
     }
     return false;
    }

    LRESULT WndProc(HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
    {
     hwnd = W_Hwnd;
     switch (BoolRegHotkey)
     {
     case WM_HOTKEY:if (BoolRegHotkey)
           {
            ShowWindow(hwnd,SW_HIDE);
           }
           else
           {
            ShowWindow(hwnd,SW_SHOW);
           }
           BoolRegHotkey = !BoolRegHotkey;
           return 0;
           break;
     case WM_DESTROY:UnregisterHotKey(hwnd,ID_HTK);
      PostQuitMessage(0);
      return 0;
      break;
     }
     return DefWindowProc(hwnd, message, wParam, lParam);
    }

    CPP全部源代码。不需要做包含把?  在网上搜索了下资料写的 也不知道对没对!哪个地方有问题麻烦说下 如何改

    也不知道 全局变量在哪儿写 所以就写到 函数的上面了  
     VC++2008 是一个DLL   想写给其他程序调用


    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖
    2009年8月24日 9:20

答案

  • 用SetWindowLong设置,不过很少在DLL里面输出WndProc的.

    在你的RegHotKey里面加句oldProc = SetWindowLong(...);

    在WndProc里面最后一句改成return CallWindowProc(oldProc, ...)


    0xBAADF00D
    • 已标记为答案 Tim Li 2009年8月31日 3:14
    2009年8月30日 7:50
    版主

全部回复

  • 这样不行的,你的WndProc没有放到窗口的线程中,是不会被执行的.


    0xBAADF00D
    2009年8月27日 14:29
    版主
  • 窗口线程 如何防止啊?  能否给个例子,是一个MFC的DLL


    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖
    2009年8月29日 9:16
  • 用SetWindowLong设置,不过很少在DLL里面输出WndProc的.

    在你的RegHotKey里面加句oldProc = SetWindowLong(...);

    在WndProc里面最后一句改成return CallWindowProc(oldProc, ...)


    0xBAADF00D
    • 已标记为答案 Tim Li 2009年8月31日 3:14
    2009年8月30日 7:50
    版主
  • BOOL BoolRegHotkey;
    HWND W_Hwnd;
    int ID_HTK;
    int OldProc,ScrollProc;
    extern "C" _declspec(dllexport) BOOL __stdcall RegHotKey(HWND Hwnd,int ID_HOTKEY,char Key)
    {
     OldProc = SetWindowLong(Hwnd,GWL_WNDPROC,ScrollProc);
     if (RegisterHotKey(Hwnd,ID_HOTKEY,MOD_CONTROL|MOD_ALT,Key))
     {
      return true;
      W_Hwnd = Hwnd;
      BoolRegHotkey = true;
      ID_HTK = ID_HOTKEY;
     }
     return false;
     BoolRegHotkey = false;
    }

    extern "C" _declspec(dllexport) BOOL __stdcall UnHotKey(HWND Hwnd,int ID_HOTKEY)
    {
     if (UnregisterHotKey(Hwnd,ID_HOTKEY))
     {
      return true;
     }
     return false;
    }

    LRESULT WndProc(HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
    {
     hwnd = W_Hwnd;
     switch (BoolRegHotkey)
     {
     case WM_HOTKEY:if (BoolRegHotkey)
           {
            ShowWindow(hwnd,SW_HIDE);
           }
           else
           {
            ShowWindow(hwnd,SW_SHOW);
           }
           BoolRegHotkey = !BoolRegHotkey;
           return 0;
           break;
     case WM_DESTROY:UnregisterHotKey(hwnd,ID_HTK);
      PostQuitMessage(0);
      return 0;
      break;
     }
     return CallWindowProc((WNDPROC)OldProc,hwnd,message,wParam,lParam);
    }

    这样?


    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖
    2009年9月1日 2:22