<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      C# 調用 Win10/11 文件關聯對話框

      方法一:調用未公開接口 IOpenWithLauncher

      Adobe Acrobat 應該是調用的未公開接口方法
      [ComImport]
      [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
      [Guid("6A283FE2-ECFA-4599-91C4-E80957137B26")]
      interface IOpenWithLauncher
      {
          [PreserveSig]
          int Launch(IntPtr hWndParent,
               [MarshalAs(UnmanagedType.LPWStr)] string lpszPath,
               IMMERSIVE_OPENWITH flags);
      }
      
      [Flags]
      enum IMMERSIVE_OPENWITH
      {
          NONE = 0,
          OVERRIDE = 0x1,
          DONOT_EXEC = 0x4,
          PROTOCOL = 0x8,
          URL = 0x10,
          USEPOSITION = 0x20,
          DONOT_SETDEFAULT = 0x40,
          ACTION = 0x80,
          ALLOW_EXECDEFAULT = 0x100,
          NONEDP_TO_EDP = 0x200,
          EDP_TO_NONEDP = 0x400,
          CALLING_IN_APP = 0x800,
      };
      
      public static void ShowSetAssocDialog(string extension)
      {
          var CLSID_ExecuteUnknown = new Guid("{E44E9428-BDBC-4987-A099-40DC8FD255E7}");
          var obj = Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_ExecuteUnknown));
          if (obj is IOpenWithLauncher launcher)
          {
              launcher.Launch(IntPtr.Zero, extension, IMMERSIVE_OPENWITH.DONOT_EXEC);
              Marshal.ReleaseComObject(launcher);
          }
      }
      

      方法二:通過模擬點擊屬性對話框“更改”打開方式

      此方法來自兩年前我的自問自答,代碼引用了 《C# 窗口過程消息處理 WndProc》 中的附加到其他窗口輔助類

      Bandizip 使用的這種方法
      [DllImport("shell32.dll", CharSet = CharSet.Auto)]
      static extern bool SHObjectProperties(IntPtr hWnd, SHOP shopObjectType, string pszObjectName, string pszPropertyPage);
      
      enum SHOP
      {
          PRINTERNAME = 1,
          FILEPATH = 2,
          VOLUMEGUID = 4
      }
      
      [DllImport("kernel32.dll")]
      static extern int GetCurrentProcessId();
      
      [DllImport("user32.dll")]
      static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);
      
      [DllImport("user32.dll", CharSet = CharSet.Auto)]
      static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
      
      [DllImport("user32.dll", CharSet = CharSet.Auto)]
      static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
      
      [DllImport("user32.dll")]
      static extern bool SetForegroundWindow(IntPtr hWnd);
      
      [DllImport("user32.dll")]
      static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);
      
      delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
      
      public static void ShowSetAssocDialog(string extension)
      {
          string fileName = Path.ChangeExtension(Path.GetRandomFileName(), extension);
          string filePath = Path.Combine(Path.GetTempPath(), fileName);
          fileName = Path.GetFileNameWithoutExtension(fileName);
          File.WriteAllText(filePath, string.Empty); // 創建臨時文件
          var frame = new DispatcherFrame();
          int pid = GetCurrentProcessId();
          SHObjectProperties(IntPtr.Zero, SHOP.FILEPATH, filePath, null); // 顯示屬性對話框
          while (true)
          {
              bool found = !EnumWindows((hWnd, lParam) => // 枚舉窗口
              {
                  GetWindowThreadProcessId(hWnd, out int id);
                  if (id == pid) // 比較進程 id
                  {
                      const int MAX_PATH = 260;
                      var sb = new StringBuilder(MAX_PATH);
                      GetClassName(hWnd, sb, sb.Capacity);
                      if (sb.ToString() == "#32770") // 對話框類名
                      {
                          GetWindowText(hWnd, sb, sb.Capacity);
                          if (sb.ToString().Contains(fileName)) // 對話框標題是否包含文件名
                          {
                              SetWindowPos(hWnd, IntPtr.Zero, 0, 0, 0, 0, SWP.HIDEWINDOW); // 隱藏屬性對話框
                              MessageHooker.AddHook(hWnd, (ref Message m) =>
                              {
                                  const int PSM_CHANGED = 0x400 + 104;
                                  if (m.Msg == PSM_CHANGED) // 監測屬性表頁更改
                                  {
                                      frame.Continue = false;
                                      PostMessage(hWnd, WM.CLOSE, 0, 0); // 等效 EndDialog(hWnd, 0)
                                  }
                                  return false;
                              });
                              SetForegroundWindow(hWnd);
                              SendKeys.SendWait("%C"); // ALT + C 快捷鍵
                              return false;
                          }
                      }
                  }
                  return true;
              }, IntPtr.Zero);
              if (found) break;
          }
          File.Delete(filePath); // 刪除臨時文件
          Dispatcher.PushFrame(frame);
      }
      

      相關資料

      Redirecting Open With in Properties Dialog in Windows 10

      How to call the "Open With" dialog used to associate file formats in Windows 10 or 11?

      posted @ 2025-04-02 15:32  藍點lilac  閱讀(331)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 四虎影视久久久免费| 国产91色综合久久免费| V一区无码内射国产| 皋兰县| 人人爽天天碰天天躁夜夜躁| 成人国产精品一区二区不卡| 国产精品亚洲а∨天堂2021| 亚洲精品日韩在线观看| 少妇伦子伦精品无吗| 久久久久综合一本久道| 精品国产高清中文字幕| 人人妻人人爽人人添夜夜欢视频| 国产精品中文字幕在线| 国偷自产av一区二区三区| 女同亚洲精品一区二区三| 九九热在线免费精品视频| 成人特黄特色毛片免费看 | 国产99久久亚洲综合精品西瓜tv| 亚洲国产欧美在线看片一国产| 国产综合精品一区二区在线| 日本国产精品第一页久久| 无码人妻一区二区三区在线视频 | 久久天天躁夜夜躁狠狠| 国产成人不卡一区二区| 免费看欧美日韩一区二区三区| 欧美经典人人爽人人爽人人片| 亚洲精品二区在线播放| 天堂av成人网在线观看| 丝袜a∨在线一区二区三区不卡| 亚洲成av人片无码迅雷下载| 久久一级黄色大片免费观看| 国产情侣激情在线对白| 亚洲国产一区二区三区| 亚洲精品日韩久久精品| 人妻激情另类乱人伦人妻| 国产69精品久久久久人妻刘玥| 最新国产精品亚洲| 久久久久久无码午夜精品直播| 97se亚洲国产综合自在线观看| 亚洲精品美女一区二区| 滨海县|