نمایش نتایج 1 تا 8 از 8

نام تاپیک: گرفتن پیغام تغییر کلیبرد

  1. #1
    کاربر دائمی آواتار A_Salimi
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    North khorasan-Esfarayen
    پست
    372

    Lightbulb گرفتن پیغام تغییر کلیبرد

    سلام

    آیا راهی وجود دارد که بتوان پیغام COPY ، CUT و در کل پیغام تغییر کلیبرد را دریافت کرد ؟


    با تشکر

  2. #2

    نقل قول: گرفتن پیغام تغییر کلیبرد

    اگر منظورتان موارد داخل Clipboard، خواند و نوشتن محتویات آن ها هست توابع زیر برای این کار هست:
    OpenClipboard
    EmptyClipboard
    GetClipboardViewer
    GetClipboardOwner

    SetClipboardData
    GetClipboardData

  3. #3
    کاربر دائمی آواتار A_Salimi
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    North khorasan-Esfarayen
    پست
    372

    نقل قول: گرفتن پیغام تغییر کلیبرد

    منظورم هر تغییری در کلیبرد است .یعنی میخواهم هروقت تغییری در آن ایجاد شد یک پیغام به برنامه من فرسناده شود.(مثلا شاید بخواهم یک سرویس بنویسم که از یک فولدر خاص محافظت کند و هر وقت کپی شد کلیبرد را خالی کند).

  4. #4

    نقل قول: گرفتن پیغام تغییر کلیبرد

    برای این کار برنامه شما باید یک Clipboard Viewer شود.
    با استفاده از SetClipboardViewer پنجره کنونی را به Viewer تبدیل می کنید (در پیام WM_CREATE در هنگام شروع برنامه یا همان OnCreate در MFC) و پنجره بعد از آن می تواند پیام WM_DRAWCLIPBOARD را دریافت کند، این پیام وقتی ارسال می شود که اطلاعاتی در Clipboard وارد می شود و شما می توانید در آن با توجه به نوعی که واردش می شود آن را پردازش کنید (text باشد یا فایل یا ...).

    WM_CHANGECBCHAIN نیز باید با SendMessage تنظیم شود تا اگر پنجره دیگری خودش را از حالت Clipboard Viewer خارج کرد آن را حذف کنیم. (از پارامتر های این پیام استفاده می کنیم).


    // OnCreate
    HWND hwndNextViewer;
    hwndNextViewer = SetClipboardViewer () ;
    سپس در پیام WM_DRAWCLIPBOARD (همان OnDrawClipboard در MFC) مثلا به این شکل:

    TCHAR fileName[256];
    HDROP hdrop;

    //--------------
    OpenClipboard (hwnd) ;

    if (hwndNextViewer)
    ::SendMessage (hwndNextViewer, WM_CHANGECBCHAIN, 0, 0) ; // It is necessary

    hdrop = (HDROP) ::GetClipboardData (CF_HDROP) ;
    ::DragQueryFile(hdrop,0 ,fileName, sizeof(fileName)/2);

    // use fileName here, for example: fileName = C:\myfile.dat

    CloseClipboard () ;
    با DragQueryFile و فلگ CF_HDROP برای کپی کردن فایل ها استفاده می کنیم و fileName مسیر فایل را می دهد.
    مثلا وقتی فایل همان مورد نظر بود می توانید با EmptyClipboard آن را خالی کنید.

    برای نوشته ها باید از CF_TEXT استفاده کنید. و ...

    برای پیام WM_CHANGECBCHAIN هم به این شکل(همان OnChangeCbChain):



    if ((HWND) hWndRemove == hwndNextViewer)
    hwndNextViewer = (HWND) hWndAfter ;

    else if (hwndNextViewer)
    ::SendMessage (hwndNextViewer, WM_CHANGECBCHAIN, hWndRemove, hWndAfter) ;


    - در هنگام بستن برنامه هم باید ChangeClipboardChain را فراخوانی کنید.


  5. #5

    نقل قول: گرفتن پیغام تغییر کلیبرد

    WM_DRAWCLIPBOARD
    این روال داخل win32 هم قابل دست رسی هست اگه هست چه جوری یعنی همین WM_DRAWCLIPBOARD را داخل switch مسج بزاریم میشه یا نه

  6. #6

    نقل قول: گرفتن پیغام تغییر کلیبرد

    نقل قول نوشته شده توسط meysamg_alone مشاهده تاپیک
    WM_DRAWCLIPBOARD
    این روال داخل win32 هم قابل دست رسی هست اگه هست چه جوری یعنی همین WM_DRAWCLIPBOARD را داخل switch مسج بزاریم میشه یا نه
    بله، فقط باید در WM_CREATE همان SetClipboardViewer را با Hwnd پنجره فراخوانی کنید:

    HWND hwndNextViewer;
    hwndNextViewer = SetClipboardViewer ( hwnd ) ;

  7. #7
    کاربر دائمی آواتار A_Salimi
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    North khorasan-Esfarayen
    پست
    372

    نقل قول: گرفتن پیغام تغییر کلیبرد

    روش خیلی جالبی بود.

    زمانی که در OnCreat از SetClipboardViewer استفاده میکردم برنامه در ابتدای اجرا با یک پیغام مواجه میشد که به این دلیل آن را در OnInitDialog قرار دادم.


    آیا میشود از این روش در برنامه نویسی سرویس هم استفاده کرد ؟چون ما در سرویس هیچ پنجره ایی نداریم چطور میتوانیم از Event هایی که در اینجا داریم در آنجا هم استفاده کنیم ؟

  8. #8

    نقل قول: گرفتن پیغام تغییر کلیبرد

    سرویس ها قابلیتی دارند که با ایجاد تغییر در فلگ های آن هنگام ساخت سرویس، می توانید کاری کنید که سرویس GUI داشته باشد یا بتواند با کاربر تعامل داشته باشد.

    مثلا در CreateService فلگ SERVICE_INTERACTIVE_PROCESS را انتخاب کنید و lpServiceStartName را NULL .

    جزییات بیشتری از نحوه دقیق انجام این کار ندارم، لذا در صورت نیاز "Interactive Services" را جستجو کنید

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •