我设置了一个全局钩子(鼠标),
LRESULT WINAPI MouseProc(int nCode,WPARAM wparam, LPARAM lparam)
{
    LPMOUSEHOOKSTRUCT pMousehook=(MOUSEHOOKSTRUCT FAR*)lparam;
    HWND hwnd=pMousehook->hwnd;
    if(nCode>=0){//这里应该如何处理?
        if(hwnd是我要处理的窗口){
             ::SetWindowPos(hwnd,......);
             switch(wparam){
             case WM_MOUSEMOVE:
               //不知道如何做,对还是不对?
                 break;
             default:
                 break;
        }
        else{
            ::SendMessage(.....);//其它处理
        }
    }
    return CallNextHook(......);
}
    请高手指点.我想目标窗口的鼠标选择功能(点左键拖动鼠标).有详细代码一定给分!在这里给40分.
   http://www.csdn.net/expert/topic/795/795870.xml?temp=.3034326

解决方案 »

  1.   

    我不明白你这么做的用意。如果您是想模拟“拖拽标题栏以移动窗口”这一功能,即,像winamp那样,点击窗口的任何一个部位都可以移动窗口,你可以用如下方式来实现它:(我给出完整的代码,用SDK编写,如果你对其中的message cracker不熟悉,可以给我来信[email protected],如果你有其他方面的问题,也能给我来信,我们可以一起讨论)
    file stdafx.h :
    #include <windows.h>
    #include <windowsx.h> // for message cracker
    #include <tchar.h> // for unicodefile stdafx.cpp
    #include "stdafx.h"file test.cpp
    #include "stdafx.h"LRESULT CALLBACK
    WndProc( HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam );// message cracker functions
    void 
    Cls_OnDestroy(HWND hwnd);void 
    Cls_OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags);int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    const static TCHAR lpClsName[] = TEXT("test_application");
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wcex; wcex.cbSize = sizeof( wcex );
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.lpfnWndProc = WndProc;
    wcex.hInstance = hInstance;
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wcex.hIconSm = wcex.hIcon;
    wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
    wcex.hbrBackground = GetStockBrush( WHITE_BRUSH );
    wcex.lpszClassName = lpClsName;
    wcex.lpszMenuName = NULL; if( ! RegisterClassEx( &wcex ) ) {
    goto FAILURE;
    } hwnd = CreateWindow( lpClsName, lpClsName,
    WS_OVERLAPPEDWINDOW, 
    CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT,
    NULL, NULL, hInstance, NULL );  if( ! hwnd ) {
    goto FAILURE;
    }

    ShowWindow( hwnd , nCmdShow );
    UpdateWindow( hwnd ); while( GetMessage( &msg, NULL, 0, 0 ) ) {
    TranslateMessage( &msg );
    DispatchMessage( &msg );
    }
     
    FAILURE:
    return 0;
    }
    LRESULT CALLBACK
    WndProc( HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) {
    switch( iMsg ) {
    HANDLE_MSG( hwnd, WM_LBUTTONDOWN, Cls_OnLButtonDown );
    HANDLE_MSG( hwnd, WM_DESTROY, Cls_OnDestroy );
    default:
    break;
    }
    return ( DefWindowProc( hwnd, iMsg, wParam, lParam ) );
    }
    void 
    Cls_OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags) {
    SendMessage( hwnd, WM_NCLBUTTONDOWN, (WPARAM)HTCAPTION, (LPARAM)0 );
    FORWARD_WM_LBUTTONDOWN( hwnd, fDoubleClick, x, y, keyFlags ,
    DefWindowProc );
    }
    void 
    Cls_OnDestroy(HWND hwnd) {
    PostQuitMessage( 0 );
    }
      

  2.   

    谢谢上面那位同仁的代码,我的意思是用全局钩子去处理别人的程序。因为那个程序支持拖拽拷贝(按住鼠标左键,拖动鼠标选定一部分内容,在点复制),而这个程序所打开的内容是我的,我现在想让它不能选定内容,即鼠标按住拖动也不能选定内容,也就不能复制我的内容。那个程序是我在我自己的程序中调用某个API(WinHelp)函数自己打开的。
      

  3.   

    hook WndProc and GETMSG is better. hook WM_COPY in winhelp.let it do nothing. then you text will never be put in clipboard.
      

  4.   

    我说点反面意见:
    我不用拖动呀,我先在开始点一下,虽然看不出来,然后按住shift在结尾点一下,好了,选中了!
    所以你应该挂clip board链,用某种方法检测自己的内容,然后,嘿嘿。。
      

  5.   

    上面的兄弟说得有道理,一是即使做到了拖动鼠标而不拷贝,也可以按SHIFT键拷贝(不过,在Winhelp中按SHIFT键是不能拷贝的),在我后来的几天内,我突然想到了解决的办法,以前就差那么一点点(这些是额外的工作);二是,这分留着也真没用,看各位都比我的星星多,而且提出的建议对我也有帮助,我也不敢怠慢,可惜40分的问题没有人回答,可惜可惜!
        对了,如果有什么好的建议和消息,可以发邮件给我:[email protected]