精华内容
下载资源
问答
  • 支持各种浏览器上传控件,Safari,Firefox,Opera,Google Chrome等
  • 浏览器兼容多文件上传控件

    千次阅读 2015-12-20 20:42:24
    浏览器兼容多文件上传控件 fileUpload.css @charset "utf-8"; /* CSS Document */ .fileBox { dis

    index.html

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link rel="stylesheet" href="css/fileUpload.css">
    <title>浏览器兼容多文件上传控件</title>
    </head>
    
    <body>
    <br>
    <form class="fileBox" action="" method="post" enctype="multipart/form-data">
      <input type="button" name="add" class="btn add" value="新增"  />
      <br>
      <div class="inputGroup-contener">
          <div class="inputGroup">
          <br>
          <!--自定义按钮,点击触发原生控件-->
          <input type="text" name="textField" class="textField"/>
          <input type="button" class="btn viewBtn fieldBtn" value="浏览" />
          <!--原生按钮控件,透明化覆盖在自定义按钮上方-->
          <input type="file" name="fileField" class="fileField" limitType="*.png">
          <input type="button" name="clean" class="btn cleanBtn" value="x" />
         
          <br>
          </div> 
       </div>
    </form>
    </body>
    <script src="js/jquery.js"></script>
    <script src="js/fileUpload.js"></script>
    </html>
     
    fileUpload.css

    @charset "utf-8";
    /* CSS Document */
    .fileBox {
      display:block;
      width:250px;
    }
    .inputGroup{
      position:relative;
      height:20px;
      margin-top:4px;
    }
    .fileBox .textField{ 
      position:absolute;
      top:0px;
      left:0px;
      height:16px;
      width:163px;
      border:1px solid #cdcdcd;
    }
    .viewBtn {
      position:absolute;
      top:0px;
      left:165px;
    }
    .cleanBtn {
      position:absolute;
      width:20px!important;
      top:0px;
      left:145px;
      display: none;
    border:1px solid #cdcdcd!important;
      color:#999;
    }
    .removeBtn {
      position:absolute;
      top:0px;
      left:207px;
    }
    .fileBox .btn{
      background-color:#ebedf2;
      border:1px solid #929292;
      height:20px; 
      width:40px;
      line-height:20px;
      cursor: pointer;
    }
    .fileBox .btn:hover,.fileBox .btnHover
    { background-color:#d8e8fa; border:1px solid #8cb2e2;}
    .fileBox .fileField { 
      position:absolute;
      top:0;
      left:0;
      height:22px;
      width:207px;
      filter:alapha(opicity:0); /*原生控件透明*/
      opacity:0;
      cursor:pointer;
    }

    fileUpload.js

    /*新增上传控件*/
    $(".add").click(function(){
    	var fileUpLoadCode = '<div class="inputGroup"><br><input type="text" name="textField" class="textField" /><input type="button" class="btn viewBtn fieldBtn" value="浏览" /><input type="file" name="fileField" class="fileField" limiType="*.png"><input type="button" name="clean" class="btn cleanBtn" value="x" /><input type="button" name="remove" class="btn removeBtn" value="删除" /><br></div> ';
    	$(".inputGroup-contener").append(fileUpLoadCode);
    });
    /*清空原生控件值和自定义控件值*/
    $(".cleanBtn").live("click",function(e){
    	var file= $(this).parent().find(".fileField");
    	file.after(file.clone().val(""));
    	file.remove();
    	$(this).parent().find(".textField").val("");
    	$(this).hide();
      });
     /*删除新增的上传控件*/
    $(".removeBtn").live("click",function(e){
    	var group= $(this).parent();
    	group.remove();
      });
    /*清空原生控件值和自定义控件值*/
    $(".fileField").live("mouseover",function(e){$(this).parent().find(".fieldBtn").addClass("btnHover");});
    $(".fileField").live("mouseout",function(e){$(this).parent().find(".fieldBtn").removeClass("btnHover");});
    /*将原生控件值传给自定义输入框*/
    $(".fileField").live("change",function(e){
        var val=$(this).parent().find(".fileField").val();
        $(this).parent().find(".textField").attr("value",val);
    	$(this).parent().find(".cleanBtn").show();
      });
    
    ps.浏览器兼容样式参考网上教程。

    展开全文
  • 支持浏览器高拍仪开发控件

    千次阅读 2019-06-11 18:09:14
    为响应客户要求及技术发展新趋势,我司WEB控件包已支持谷歌、火狐、百度、360、QQ、IE10及以上等支持HTML5的浏览器。有demo、控件上传方法,开发手册便于二次开发。 点击获取更多信息...

    为响应客户要求及技术发展新趋势,我司WEB控件包已支持谷歌、火狐、百度、360、QQ、IE10及以上等支持HTML5的浏览器。有demo、控件及上传方法,开发手册便于二次开发。

    点击获取更多信息http://www.imgexpress.cn/news/34-cn.html
    支持多浏览器高拍仪开发控件

    转载于:https://blog.51cto.com/14306103/2407515

    展开全文
  • 其实大致可以分为两种,其一就是ie内核的浏览器,其二就是非ie内核的浏览器,前者是支持Activex控件的开发,而后者是支持NPAPI控件的开发,想要开发一个既可以支持ie内核的浏览器支持非ie内核的浏览器控件,...

    现今浏览器有很多种,其实大致可以分为两种,其一就是ie内核的浏览器,其二就是非ie内核的浏览器,前者是支持Activex控件的开发,而后者是支持NPAPI控件的开发,想要开发一个既可以支持ie内核的浏览器又支持非ie内核的浏览器控件,firebreath就是一个很好的选择,当然你们也可以开发两种对应不同的浏览器就好。

    这里不叙述firebreath的安装和如何使用,网上有很多相关的信息。

    安装好firebreath后,先要注册接口,这个接口就是网站向控件传递参数的函数,其实很简单,建立一个firebreath工程里面就有例子,依葫芦画瓢就好,值得注意的是,vs生成的dll是debug版本的,大小接近4MB,有些大,这时你可以把debug换成release的,设置好参数后,生产大小只有1.2MB左右,合适了。

    这时我们的接口已经做好,我做了一个截屏的控件,先贴firebreath的部分代码:

    .h文件

    [cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. #include <string>  
    2. #include <sstream>  
    3. #include <boost/weak_ptr.hpp>  
    4. #include "JSAPIAuto.h"  
    5. #include "BrowserHost.h"  
    6. #include "GoldArmor.h"  
    7. #include <wtypes.h>  
    8. #ifndef H_GoldArmorAPI  
    9. #define H_GoldArmorAPI  
    10.   
    11. class GoldArmorAPI : public FB::JSAPIAuto  
    12. {  
    13. public:  
    14.     GoldArmorAPI(const GoldArmorPtr& plugin, const FB::BrowserHostPtr& host) :  
    15.       m_plugin(plugin), m_host(host)  
    16.       {  
    17.           //绑定版本号  
    18.           registerMethod("getversion", make_method(this, &GoldArmorAPI::getversion));  
    19.           //绑定图片名和图片地址  
    20.           registerMethod("ReturnUrl", make_method(this, &GoldArmorAPI::ReturnUrl));  
    21.           //绑定Address  
    22.           registerMethod("SendAddress", make_method(this, &GoldArmorAPI::SendAddress));  
    23.           //绑定端口  
    24.           registerMethod("Setport", make_method(this, &GoldArmorAPI::Setport));  
    25.           //绑定Action  
    26.           registerMethod("SetAction", make_method(this, &GoldArmorAPI::SetAction));  
    27.           //绑定Parater  
    28.           registerMethod("SendParater", make_method(this, &GoldArmorAPI::SendParater));  
    29.           //绑定Cookies  
    30.           registerMethod("CookiesParatar", make_method(this, &GoldArmorAPI::CookiesParatar));  
    31.           //绑定截屏端口  
    32.           registerMethod("GetCatchScreenAndRM", make_method(this, &GoldArmorAPI::GetCatchScreenAndRM));  
    33.       }  
    34.       //析构函数  
    35.       virtual ~GoldArmorAPI(){;}  
    36.       //得到版本号  
    37.       FB::variant getversion();  
    38.       //得到图片名和图片地址  
    39.       void ReturnUrl();  
    40.       //设置Address  
    41.       void SendAddress(const FB::variant& address);  
    42.       //设置端口  
    43.       void Setport(const FB::variant& myport);  
    44.       //设置Action  
    45.       void SetAction(const FB::variant& myaction);  
    46.       //设置Parater  
    47.       void SendParater(const FB::variant& myparater);  
    48.       //设置Cookies  
    49.       void CookiesParatar(const FB::variant& mycookies);  
    50.       //设置截屏端口  
    51.       void GetCatchScreenAndRM();  
    52. private:  
    53.     GoldArmorWeakPtr m_plugin;  
    54.     FB::BrowserHostPtr m_host;  
    55.     //需要保存传过来的数据,c++builder和vs中字符串的格式不一样,所以转换的时候可能有些麻烦。  
    56.     //我们直接用wchar_t*来保存数据。  
    57.     wchar_t *pictureurl, *picturename, *cookies, *actionparater, *transmitaddress, *port, *action;  
    58. };  
    59. #endif  
    .cpp文件
    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. #include "JSObject.h"  
    2. #include "variant_list.h"  
    3. #include "DOM/Document.h"  
    4. #include "global/config.h"  
    5. #include "GoldArmorAPI.h"  
    6. #include <atltime.h>  
    7. #include <atlstr.h>  
    8. #include "resource.h"  
    9. #include <windows.h>  
    10.   
    11. BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);  
    12. //图标句柄  
    13. HICON hdicon = NULL;  
    14. //返回版本号  
    15. FB::variant GoldArmorAPI::getversion()  
    16. {  
    17.     return 6300;  
    18. }  
    19. //得到图片名和图片地址  
    20. void GoldArmorAPI::ReturnUrl()  
    21. {  
    22.     CString temp;  
    23.     CTime start_time = CTime::GetCurrentTime();  
    24.     temp = start_time.Format(_T("%Y_%m_%d_%H_%M_%S")) + ".JPEG";  
    25.     this->picturename = temp.AllocSysString();  
    26.     //添加系统临时目录  
    27.     char *s;  
    28.     size_t len;  
    29.     errno_t err = _dupenv_s(&s, &len, "TEMP");  
    30.     if (err)  
    31.     {  
    32.         exit(-1);  
    33.     }  
    34.     CString url = s;  
    35.     url = url + "/" + temp;  
    36.     this->pictureurl = url.AllocSysString();  
    37. }  
    38. //设置Address  
    39. void GoldArmorAPI::SendAddress(const FB::variant& address)  
    40. {  
    41.     std::wstring _transmitaddress = address.convert_cast<std::wstring>();  
    42.     CString temp = _transmitaddress.c_str();  
    43.     this->transmitaddress = temp.AllocSysString();  
    44. }  
    45. //设置端口  
    46. void GoldArmorAPI::Setport(const FB::variant& myport)  
    47. {  
    48.     std::wstring _port = myport.convert_cast<std::wstring>();   
    49.     CString temp = _port.c_str();  
    50.     this->port = temp.AllocSysString();  
    51. }  
    52. //设置Action  
    53. void GoldArmorAPI::SetAction(const FB::variant& myaction)  
    54. {  
    55.     std::wstring _myaction = myaction.convert_cast<std::wstring>();     
    56.     CString temp = _myaction.c_str();  
    57.     this->action = temp.AllocSysString();  
    58. }  
    59. //设置Parater  
    60. void GoldArmorAPI::SendParater(const FB::variant& myparater)  
    61. {  
    62.     std::wstring _myparater = myparater.convert_cast<std::wstring>();   
    63.     CString temp = _myparater.c_str();  
    64.     this->actionparater = temp.AllocSysString();  
    65. }  
    66. //设置Cookies  
    67. void GoldArmorAPI::CookiesParatar(const FB::variant& mycookies)  
    68. {  
    69.     std::wstring _mycookies = mycookies.convert_cast<std::wstring>();   
    70.     CString temp = _mycookies.c_str();  
    71.     this->cookies = temp.AllocSysString();  
    72. }  
    73. //非模态对话框控件事件  
    74. BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)  
    75. {  
    76.     switch(message)  
    77.     {  
    78.         case WM_INITDIALOG:  
    79.         {  
    80.             //这里加载窗口图标  
    81.             SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hdicon);  
    82.             return TRUE;  
    83.         }  
    84.         case WM_COMMAND:  
    85.         {  
    86.             switch(wParam)  
    87.             {  
    88.                 case IDOK:  
    89.                 {  
    90.                     if (hDlg)  
    91.                     {  
    92.                         PostQuitMessage(1);  
    93.                         return TRUE;  
    94.                     }  
    95.                 }  
    96.                 case IDCANCEL:  
    97.                 {  
    98.                     if (hDlg)  
    99.                     {  
    100.                         PostQuitMessage(0);  
    101.                         return TRUE;  
    102.                     }  
    103.                 }  
    104.             }  
    105.             break;  
    106.         }  
    107.         case WM_ACTIVATE:  
    108.         {  
    109.             switch(wParam)  
    110.             {  
    111.             case WA_INACTIVE:  
    112.                 {  
    113.                     if (hDlg)  
    114.                     {  
    115.                         RECT myrerct;  
    116.                         GetWindowRect(hDlg, &myrerct);   
    117.                         SetWindowPos(hDlg, HWND_TOPMOST, myrerct.left, myrerct.top, myrerct.right - myrerct.left, myrerct.bottom - myrerct.top, SWP_NOMOVE | SWP_NOSIZE |SWP_NOACTIVATE);  
    118.                     }  
    119.                     break;  
    120.                 }  
    121.             }  
    122.             break;  
    123.         }  
    124.     }  
    125.     return FALSE;  
    126. }  
    127. //设置截屏端口  
    128. void GoldArmorAPI::GetCatchScreenAndRM()  
    129. {  
    130.     //以下适用于谷歌浏览器等,但不适用于火狐.  
    131.     HWND isCatchOpen = FindWindow(_T("TCatchScreenForm"), _T("截屏控件"));  
    132.     if (IsWindowVisible(isCatchOpen))  
    133.     {  
    134.         return;  
    135.     }  
    136.     //适用于火狐的.  
    137.     HWND isTipsOpen = FindWindow(NULL, _T("Live800准备截屏"));  
    138.     if (isTipsOpen)  
    139.     {  
    140.         SetForegroundWindow(isTipsOpen);  
    141.         return;  
    142.     }  
    143.     CString mydll = _T("npScreenShot.dll");  
    144.     HMODULE hOcx = GetModuleHandle(mydll);  
    145.     wchar_t szPath[1024] = {  
    146.         '\0'  
    147.     };  
    148.     GetModuleFileName(hOcx, szPath, 1024);  
    149.     PathRemoveFileSpec(szPath);  
    150.     PathAppend(szPath, _T("CatchScreen.dll"));  
    151.     //这里苹果浏览器加载c++builder的dll会报错,然而加载c++的dll就不会报错.  
    152.     //这里造成的原因是c++builder的dll用到了vcl,而苹果浏览器是不支持vcl的.  
    153.     //对于某些电脑的浏览器这里需要放一个MessageBox才可以截屏,否则加载动态库的时候出错.  
    154.     //这里若用clr建立界面会出现问题,编译器编译不了,这里需要使用非模态对话框并置顶.  
    155.     MSG msg;  
    156.     hdicon = LoadIcon(hOcx, MAKEINTRESOURCE(IDI_CATCHSCREENICON));  
    157.     HWND hDialog = CreateDialog(hOcx, MAKEINTRESOURCE(IDD_CATCHSCREENTPS), NULL, DlgProc);  
    158.     while(GetMessage(&msg, NULL, 0, 0))  
    159.     {  
    160.         if(hDialog == NULL || !IsDialogMessage(hDialog, &msg))  
    161.         {  
    162.             TranslateMessage(&msg);  
    163.             DispatchMessage(&msg);  
    164.         }  
    165.     }  
    166.     if (msg.wParam == 1)  
    167.     {  
    168.         if(DestroyWindow(hDialog))  
    169.         {  
    170.             if (InvalidateRect(GetForegroundWindow(), NULL, TRUE))  
    171.             {  
    172.                 if (UpdateWindow(GetForegroundWindow()))  
    173.                 {  
    174.                     if (SetForegroundWindow(GetForegroundWindow()))  
    175.                     {  
    176.                         SYSTEM_INFO si;  
    177.                         GetNativeSystemInfo(&si);  
    178.                         if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 || si.wProcessorArchitecture != PROCESSOR_ARCHITECTURE_IA64)  
    179.                         {  
    180.                             Sleep(100);  
    181.                         }  
    182.                         HMODULE ShowCatchScreen = LoadLibrary(szPath);  
    183.                         if (ShowCatchScreen)  
    184.                         {  
    185.                             void(WINAPI* CatchScreenPort)(wchar_t* pictureurl, wchar_t* picturename, wchar_t* cookies, wchar_t* actionparater, wchar_t* transmitaddress, wchar_t* port, wchar_t* action);  
    186.                             CatchScreenPort = (void(WINAPI*)(wchar_t* pictureurl, wchar_t* picturename, wchar_t* cookies, wchar_t* actionparater, wchar_t* transmitaddress, wchar_t* port, wchar_t* action))GetProcAddress(ShowCatchScreen, "OpenCatchScreen");  
    187.                             CatchScreenPort(pictureurl, picturename, cookies, actionparater, transmitaddress, port, action);  
    188.                         }  
    189.                     }  
    190.                 }  
    191.             }  
    192.         }  
    193.     }  
    194.     else if (msg.wParam == 0)  
    195.     {  
    196.         DestroyWindow(hDialog);  
    197.     }  
    198. }  

    .h文件很好理解,.cpp文件有几个地方需要注意,我依次向下说明:

    (我的截屏按钮点击后会出现一个提示框,这时用户可以选择需要截屏的位置,点击开始截屏就好,我的考虑是若一个浏览器有两个标签,其中一个有截屏按钮,而需要我们截屏的区域在第二个标签,若我们点击截屏后就开始截屏,这时我们能截屏的区域只是第一个标签的界面。这个提示界面是win32做的非模态对话框,在我的代码就可以看出来,之所以选择win32而不选择其他,比如clr或者mfc,主要是因为这个工程不支持clr,我们在工程里面建立clr窗体,工程不能建立,若使用clr的dll,工程动态加载,可以实现打开窗口,但是一旦关闭窗口所有浏览器都会重新刷新页面,这个可能跟底层有关,我们不去深究。)

    1,以下代码是修正Google浏览器bug的,这个bug是当用户连续点击截屏按钮时虽然当时只弹出一个提示框,但是当这个提示框关闭或者提示框中点击开始截屏按钮就会出现很多个截屏提示框,造成这个原因的是Google等浏览器用的是消息队列,也就是我们的n次点击都在这个队列里面,只有最先的那个结束了才会执行第二个,这样就造成连续点击截屏按钮出现的bug,我这里也只是解决了在提示框里面点击开始截屏弹出很多截屏提示框的问题,当关闭提示框我暂时没解决,有兴趣的朋友可以自己去研究。

    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. //以下适用于谷歌浏览器等,但不适用于火狐.  
    2. HWND isCatchOpen = FindWindow(_T("TCatchScreenForm"), _T("截屏控件"));  
    2,以下代码解决火狐等浏览器连续点击网页上的截屏按钮出现的多个提示框,造成这个原因的是火狐等浏览器是即时执行的,就是点击按钮就执行,而不是把消息放在队列里面。

    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. HWND isTipsOpen = FindWindow(NULL, _T("Live800准备截屏"));  
    3,我的截屏dll(CatchScreen.dll)是用c++builder2010做的,加载到Safari浏览器可能会出错,主要是由于safari和c++builder的vcl不兼容造成的,你们可以用vs2010的atl建立动态链接库dll,我想这个问题就能解决,不能用clr或者mfc建立dll。

    4,以下一句话是加载截屏提示框对话框的标题图标。

    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. hdicon = LoadIcon(hOcx, MAKEINTRESOURCE(IDI_CATCHSCREENICON));  
    5,以下一句话是加载截屏提示框并打开,这个对话框是非模态的对话框。

    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. HWND hDialog = CreateDialog(hOcx, MAKEINTRESOURCE(IDD_CATCHSCREENTPS), NULL, DlgProc);  
    以上4和5点我们需要注意的是:可能部分的不知道怎么用win32建立非模态对话框,这个你们可以去网上找,在该工程里面找到我们的接口项目,也就是上面两个文件所在的项目,在项目里面有个Generated目录,里面有个firebreathWin.rc文件,这个就是资源文件,这里最好把这个文件备份一下,后面要用到,在win32项目中所有的对话框资源或者其他资源就是建立这里面的,建立资源很简单,右键这个文件,选择打开方式,里面有个资源编辑器,打开后就可以像win32那样建立对话框资源IDD_CATCHSCREENTPS和图标资源IDI_CATCHSCREENICON。

    很可悲的是当我们建立好后生成时rc文件却出现了问题,按理说不应该,可是还是出现了,原来我们编辑好后的rc文件不能被该工程很好的编译,只要修改rc文件就好,不要去注释掉rc中不能编译的代码,这样可能出现未知的错误。其实解决的办法很简单,这个时候的rc文件里面加载你的对话框资源和图标资源,你可以右键firebreathWin.rc文件,选择打开方式C++源代码编辑器,可以看到这个资源文件的代码,把这个文件的所有代码复制下来保存在一个记事本里面,然后退出vs编译器,把以上备份的rc文件覆盖你编辑的文件,再用C++源代码编辑器打开这个最原始的rc文件,和你复制下来的还有对话框和图标资源的rc文件进行对比,你就会发现问题了,是不是很简单,只要把开头的部分和结束的部分换成最原始rc文件的代码,中间的对话框和图标资源不变,这个问题就解决了。

    6,细心的人就会发现我的非模态窗口摧毁是在点击开始截屏按钮或者关闭截屏提示框的时候执行的,而网站上的是在发送退出消息前,这是由于猎豹浏览器造成的,一部分系统的猎豹浏览器在退出时不能把下面的函数放在PostQuitMessage前面。

    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. DestroyWindow(hDialog);  

    7,最后一点,也是最重要的一点,要想你做的dll对所有浏览器都支持,那么firebreath做的dll必须np开头,否则不能支持所有浏览器,同时需要regsvr32这个dll。


    好了截屏的接口做好了,接下来就是截屏的dll,这里可以用vs的atl,我用的是c++builder的vcl,这里不贴代码,直接上传项目。

    链接地址:http://download.csdn.net/detail/kk618172/6788619

    值得注意的是,在我的CatchScreenCtrl.cpp文件里面打开截屏窗口用的是myCatchScreenForm->Show(),而不是myCatchScreenForm->ShowModal(),这是由于我如果用第二个则火狐浏览器就会有问题,我不是很明白。大家可以看代码,在关键的地方我注释了的,比如QQ浏览器出现黑屏的情况。


    好了截屏操作dll完了,该上传截屏图片到服务器,这里用的vs2010,这个也不贴代码,直接上传项目:

    链接地址:http://download.csdn.net/detail/kk618172/6788651

    值得注意的是,在代码里面我判断了上传的协议,这里需要截屏的接口传递过来。


    好了上传文件dll也完了,最后一个的dll,是一个键盘钩子,也是我用c++builder做的,这里也不贴代码,直接上传项目:

    链接地址:http://download.csdn.net/detail/kk618172/6788661

    我说一下这个dll的作用,就是用户截屏时候对文字处理时,判断是否超出边界,这时就是否禁用键盘,也可以不要这个dll,若实现这个功能还有其他方式,望大家告诉我。


    以下是测试html。

    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. <html>  
    2. <head>  
    3. <title>截图测试</title>  
    4. </head>  
    5. <body>  
    6. <object id="plugin1" type="application/catchscreen-live800" width="0" height="0"></object>  
    7. <a href="#" onclick="plugin1.getversion();plugin1.ReturnUrl();plugin1.SendAddress('www.live800.com');plugin1.Setport(':8080');plugin1.SetAction('/test1/ChaterServer');plugin1.SendParater('&rid=1232&visitorIDInSession=11');plugin1.CookiesParatar('');plugin1.GetCatchScreenAndRM()" >截屏</a>  
    8. </body>  
    9. </html>  
    展开全文
  • 用C#编写ActiveX控件,开发浏览器控件,注册ActiveX 控件用C#编写ActiveX控件 开发浏览器控件这是本控件开发完成后的一...ActiveX控件大多是使用C++来开发的,而我对他们并熟悉,因此考虑使用熟悉的C#编写ActiveX...

    用C#编写ActiveX控件,开发浏览器控件,注册ActiveX 控件
    用C#编写ActiveX控件


    开发浏览器控件这是本控件开发完成后的一个简单应用。我们可以利用它以本地文件夹为单位来批量更新服务器的文件。多线程文件夹上传实现
    最近做一个Web项目,需要自己编写一个ActiveX控件。ActiveX控件大多是使用C++来开发的,而我对他们并不熟悉,因此考虑使用熟悉的C#编写ActiveX控件。 ActiveX 控件注册

      首先,建立一个Windows控件库 项目 My_HtmlControl,并拖入一个textBox控件,此时编译项目,可以生成My_HtmlControl.dll。将此dll拷贝到IIS的虚拟根目录下,然后建立一个aa.htm的文件,html代码如下:
    <body>
    <object classid="http://localhost/My_HtmlControl.dll#My_HtmlControl.UserControl1" Width="184" Height="96">
    </object>
    </body>
    在IE地址栏中输入以下地址:http://localhost/aa.htm,出现界面:可见textBox控件文本框 控件已经成功在页面上显示了。OK,我们已经完成了第一步。
      但是问题到这里还没有解决。不相信?你可以试试在另外一台机器上测试,注意需要修改对应的html代码和URL地址。你可以看到这个在原来显示控件的地方是一个红色的叉,或者还会弹出一个对话框,表示这个控件没有任何权限。出现这个结果是微软的默认设置造成的,作者必须在控件所在的控件的 AssemblyInfo.cs/vb 中执行一个安全声明,声明这个控件必须使用赋予的权限,才可以显示出界面。
    在AssemblyInfo.cs中using System.Security;命名空间,并添加一句:
    [assembly : AllowPartiallyTrustedCallers()]
      注册ActiveX 控件现在重新编译,并且替换以前的dll,界面又可以显示出来了。
      需要提醒的是,到现在为止,我们编写的还不是真正的ActiveX控件。这个控件到现在为止,还只是能够实现自身的显示,并且不能实现更多的功能,比如实现与脚本的交互或者操作客户端的注册表或者磁盘。这是由于.Net Framework的安全模型所限制的。如果我们希望这个控件突破.Net Framework安全模型的限制,实现与脚本的交互或者操作客户端的注册表或者磁盘的话,必须要让它成为真正的ActiveX控件。下面,我们把刚才的控件变成真正的ActiveX控件。
      首先使用 工具—〉创建GUID 生成一个GUID,

    并修改UserControl1.cs文件。首先using System.Runtime.InteropServices;命名空间,并在public class UserControl1 : System.Windows.Forms.UserControl前面加入一条语句类标记:[Guid("93210714-D354-4e64-96A7-2DA3BE0E16BC")]
      注意Guid中的字符串,就是你生成的Guid字符串。它是你所生成的ActiveX控件的唯一标识符。然后修改项目属性,打开项目属性面板->配置属性->生成,将最后一项“为Com Interop注册”,我们唯一需要修改的是将其值改为True。

     重新编译。我们使用 工具—〉OLE/COM对象查看器 查看,展开.NET Category 找到My_HtmlControl.UserControl1  可以看到,我们写的My_HtmlControl.UserControl1已经被正确识别为COM组件。现在,我们已经可以像使用其它ActiveX控件一样在网页中显示了。在My_HtmlControl.UserControl1点击鼠标右键,选择Copy HTML <object> Tag to Clipboard,可以将代码拷入剪贴板。
      现在,我们改写aa.htm,html代码如下:
    <body>
    <object id="My_HtmlControl" classid="clsid:93210714-D354-4E64-96A7-2DA3BE0E16BC"></object>
    </body>

      使用IE查看,我们的控件又可以在网页中显示了。不过,这个时候它已经不再是以前的.net WinForm控件了,而是货真价实的ActiveX控件了。
      不过,编写ActiveX控件的任务还没有完成。我们还没有实现脚本互动或者读写I/O,也没有实现ActiveX控件的自动分发。下面尝试实现和JS的交互:(在UserControl1.cs中添加)
    public void ShowMessage(string msg)
    {
     if(msg != null)
     {
      MessageBox.Show(msg);
     }
    }
    重新编译 修改html代码:添加
    <input type="button" οnclick='My_HtmlControl.ShowMessage('Hello World!')' value='Click'>
    访问我们的html页,就是提示不安全信息。
      单击确定之后,我们发现JS报错。根据提示,我们判断可以通过修改IE的设置使控件运行。打开IE的 工具->Internet选项->安全->本地Intranet->自定义级别->对没有标记为安全的ActiveX控件进行初始化和运行,将其值设为启用。我们刷新页面,现在终于可以正确运行了。为什么会报错呢???
    这是因为我们必须要实现IObjectSafety接口,把ActiveX控件标记为安全的ActiveX控件。
    首先我们自己用C#实现这个接口:(在UserControl1.cs中添加)
    public void GetInterfacceSafyOptions(Int32 riid, out Int32 pdwSupportedOptions, out Int32 pdwEnabledOptions)
    {
    // TOD 添加 WebCamControl.GetInterfacceSafyOptions 实现
    pdwSupportedOptions = 1;
    pdwEnabledOptions = 2;
    }
    public void SetInterfaceSafetyOptions(Int32 riid, Int32 dwOptionsSetMask, Int32 dwEnabledOptions)
    {
    // TOD 添加 WebCamControl.SetInterfaceSafetyOptions 实现
    }
    标记Activex控件为脚本安全1.见Designing Secure ActiveX Controls,这种方法主要适用于ATL Activex控件,最好还是用C++来实现的,相对来说比较麻烦;

    2.见Marking Business Objects as Safe for Scripting,选用这种方法,则非常简单了,只需要写入两个注册表项就可以了,如下:

    [HKEY_CLASSES_ROOT\CLSID\<MyActiveXGUID>\Implemented
    Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}]
    [HKEY_CLASSES_ROOT\CLSID\<MyActiveXGUID>\Implemented
    Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}]
    通常ActiveX控件在开发并注册后,一旦在网页中运行,IE并不认为这是一个脚本安全的,会弹出一个IE提示窗口:"An ActiveX control on this page might be unsafe to interact with other parts of the page.Do you want to allow this interaction?"
     重新编译,然后将IE里面的设置改回来在注册表里添加如上两项。现在,我们发现,和JS的交互已经没有问题了。
      这样,一个最基本的ActiveX控件已经写好了。你可以在这个控件的基础上增加任何你需要的功能。到这里,编写控件的任务已经完成了,我们的下一个目标就是发布它。
      首先,我们建立一个windows安装项目,在解决方案中添加新项目【安装项目】

    ,并将ActiveX控件的主输出添加到项目输出中

    。然后,改动ActiveX控件的主输出文件,将其Register属性改为vsdrpCOM.
    改动项目属性,将引导程序更改为 Web引导程序。很遗憾的是,在 Web引导程序设置 中的安装文件夹URL中必须使用绝对路径,不能使用相对路径。这意味着生成安装程序的时候就必须确定路径,不是很方便。在示例中,我使用了localhost,在发布中可以改为实际的域名。
       现在我们生成安装程序,并把相应得程序拷贝到正确的目录中(本例中为默认网站目录下的ActiveX文件夹中)。我们可以直接执行Setup.Exe文件,以验证安装文件的正确性。在我的机器上正确执行了,成功了!

    <object id="My_HtmlControl" classid="clsid:93210714-D354-4E64-96A7-2DA3BE0E16BC" Width="184" Height="96" codebase="ActiveX/Setup.Exe">
    </object>
    codebase="ActiveX/Setup.Exe"
      注意,我们在object块中加入了codebase属性,这就是制定的下载控件的位置,可以使用相对路径。别忙,我们现在还不能正确请求这个页面,因为我们还没有对我们的控件进行签名。签名可以采用两种方式,一种是在上面生成安装程序的时候签名,另一种是使用sn.exe签名。推荐大家使用后者,因为可以提供更多选项。本人很懒,就不多写了,大家可以参考csdn上的文章《发布ActiveX》。先给给大家提个醒,在申请证书的时候选择 高级证书申请。
    检查ActiveXObject是否可用,然后引导用户下载并安装,有朋友问怎么自动下载并安装,个人认为这种做法不太合适,毕竟ActiveX对用户来说是存在风险的,所以我们必须要重视用户的知情权哦。
    var str1 = new Array();
    try
    {
    var axObj=new ActiveXObject("My_HtmlControl.UserControl1d");
    }catch(e){
    str1.push("<span class=\"red\"><a style=\"color:#f00;\" href=\"/ActiveX/Setup.Exe\">请点此安装控件后刷新</a></span>");
    document.write(str1.join(""));
    }
    alert(DetActiveX());
    // 检测系统是否禁用ActiveX
    function DetActiveX()
    {
    var kXmlHttp = null;
    try
    {/*非微软IE支持的xmlhttp对象*/
    if (typeof XMLHttpRequest != "undefined")
    {
    kXmlHttp = new XMLHttpRequest();
    return true;
    }
    else/*微软IE支持的xmlhttp对象*/
    {
    var MSie = ["MSXML2.XMLHttp.5.0","MSXML2.XMLHttp.4.0",
    "MSXML2.XMLHttp.3.0","MSXML2.XMLHttp","Microsoft.XMLHttp"];
    for (i in MSie)
    {
    kXmlHttp = new ActiveXObject(MSie[i]);
    return true;
    }
    }
    }catch(e){}

    return false;
    }
    针对网友的要求,完善了一下本文的内容
    如下在安装项目上进行设置即可,在安装软件时注册该组件在注册表中的注册等操作!如下图:

     


    对安装过程中的所有界面和安装流程控制都可以定义了。还有一点就是因为是ActiveX所有,安全认证很关键。他们和淘宝等网站上的插件是一样的。如果想要被通用那么需要认证。建立在信任基础上让客户端安装应该是最简单的解决办法。

    转载于:https://www.cnblogs.com/blogpro/p/11340578.html

    展开全文
  • 用过浏览器的开发人员都对大文件上传比较困扰,最近发现一个新的上传控件,希望能对有所帮助。在这里分享一下。 Web Uploader [url]http://fex-team.github.io/webuploader/[/url] [url]...
  • 4、项目引用的上传控件支持什么版本,比如flash版本,或支持html5页面 PS:背景: 跟踪客户一个问题,在本地验证没有发现问题后,怀疑是兼容性问题,在平时如果客户有问题,都是有运维人员联系并反馈到测试。...
  • silverUpload是基于Http协议的断点续传控件,她可以运行在ie6~ie11、firefox浏览器、谷歌浏览器、傲游浏览器,搜狗浏览器、360浏览器等常见的网页浏览器中。目前除了(Apple Safari)外,其他浏览器均运行正确。
  • 控件支持现有高拍仪设备和定制设备 现在支持的功能: 1. 提供设备选择 2. 支持设备预览 3. 设置出图格式 4. 设置分辨率 5. 支持拍照功能 6. 获取拍照图像类型文件的BASE64数据 7. 设置纠偏裁边 8. 二代证识别 9. ...
  • 最近在使用file上传控件,发现了file上传控件的两个兼容性问题:一个是file上传控件在火狐下无法通过css改变width,另一个是file上传控件在不同的浏览器下的外观和行为都一样,本文将提供详细的解决方案
  • 浏览器控件SDK V2.3.0

    2020-11-25 09:01:05
    控件支持现有高拍仪设备和定制设备 现在支持的功能: 1. 提供设备选择 2. 支持设备预览 3. 设置出图格式 4. 设置分辨率 5. 支持拍照功能 6. 获取拍照图像类型文件的BASE64数据 7. 设置纠偏裁边 8. 二代证识别 9. ...
  • 对于一般的表单,上传控件较少,这样的做法确实不错,既减少了代码,又美化了样式,原文:《定义input type="file" 的样式》  其实要实现给file控件定义样式,大致思想都是一样的。  今天看到博客园的繁花连写两...
  • swfupload上传图片控件支持删除。兼容浏览器ie7+,火狐,谷歌。上传界面类似QQ空间发表说说界面。
  • 拖拽或点击上传(在safari浏览器不支持拖拽),主要解决safari浏览器的拖拽问题 jsp页面 &lt;input type="file" id="frontImg" name="myfiles" style="display:none;"...
  • ftp上传控件

    热门讨论 2012-05-10 19:58:18
    ftp上传控件(FTP ActiveX OCX Control)是用Scoket API实现的FTP功能的客户端控件,可以在网页中实现上传文件的功能,可以在多种开发环境中使用,如VB,VC,C#,.net,PB,Delphi等。 >>上传、下载单个多个文件或目录,...
  • Atitit.hybrid混合型应用 浏览器插件,控件的实现方式 浏览器运行本地程序的解决方案大的总结---提升用户体验and开发效率.. 1. hybrid App 1 1.1. Hybrid App为什么会兴起编辑 1 1.2. 如何实现网页语言与...
  • Input file上传文件样式支持html5的...一个是file上传控件在火狐下无法通过css改变width,另一个是file上传控件在不同的浏览器下的外观和行为都一样。下面是file上传控件在IE10,firefox16,chrome22,opera12,safa...
  • 1.能够上传mp3文件,并能校验mp3的品质是否符合上传标准。 2.能单独上传mp3格式文件,还能够把mp3转换成wma格式(VBR二次压缩),自定义设置采样率和频率。...调用方便简洁,支持IE,FireFox,google,safari等多浏览器
  • .net上传控件,支持大文件,无限制

    千次阅读 2005-08-23 10:03:00
    只演示进度,保存文件)好像进度条读取数据与更新数据过快,导制浏览器无更新,以后加入刷新接口,允许用户根据情况自定义更新速度)下载地址:http://www.new57.com/download/eupload.rar内有两个控件,下载后自己看上传...
  • 兼容所有浏览器的Web打印控件的设计方案   设计方案的简单实现网址:http://www.lc-simple.com/PrintTest/   第一章:Web打印控件的原理  Web打印控件的工作的原理如下: 在需要打印的客户端电脑(操作系统...
  • 有的童鞋选择好文件,点击按钮,会报错,提示“不支持给定路径的格式”,究其最本质的原因,是浏览器问题,如有童鞋使用的猎豹浏览器的兼容模式,或者360浏览器的兼容模式,或者其他浏览器的兼容模式,可以尝试更改...
  • 先废话一小段,大家好,本人首篇处女作,为什么要实现一个上传控件呢,必然是公司需要嘛,实现整个过程挺揪心的,因为要解决ie9这个兼容性问题,整体来说我前后用了五天的时间来实现。依赖了jquery,其实也可以使用...
  • 文件上传控件

    2017-10-18 16:41:39
    支持多文件上传,兼容多浏览器依赖于flash,完整demo
  • 大概思路是这样的,既然百度的上传功能能用了,那就自己写一个吧,把工具栏中的上传图标改成我们自己的Input控件,使用Plupload.js把图片弄成文件流的形式传到后台处理页面,在后台处理页面里面把图片保存起来,...
  • 代码如下: (function() { if (window.FileUpload) { return; } window.FileUpload = function (id, url) { this.id = id; this.autoUpload = true; this.url = url; this.maxSize = null; this.extensions = null;...
  • ntko文件上传控件

    2011-06-25 10:52:32
    可以轻松迅速的将几百M甚至2G以下的文件上传到WEB服务器,并支持断点续传上载上传到WEB服务器的文件,通过web服务器编程支持,还可以采用迅雷,FLASHGET等支持断点续传下载的工具软件进行多线程,可续传的下载。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,692
精华内容 10,276
关键字:

上传控件不支持你的浏览器