A-5 다시: 폴더 고르는 창을 윈도우 폴더 선택 창으로 바꿈
요구를 잘못 읽었었다. Git 저장소 이야기로 보고 .git 찾아 올라가기를 만들었는데, 실제로는 폴더 비교 탭의 폴더 고르는 창 이야기였다. 상위 폴더를 골라 놓고 하위까지 한꺼번에 비교하고 싶은데 그 상위 폴더를 고를 방법이 없었다. 원인은 폴더 고르기를 파일 열기 창으로 돌려쓰고 있던 것이다. 이 방식은 지금 서 있는 폴더를 돌려주기 때문에, 목록에 보이는 폴더를 고르려면 반드시 그 안으로 들어가야 한다. 그래서 늘 가장 깊은 폴더만 골라졌다. - 윈도우 폴더 선택 창을 셸 COM(IFileDialog + FOS_PICKFOLDERS)으로 직접 부른다. 목록에서 폴더를 한 번 눌러 고를 수 있다. COM 이 안 되면 전에 쓰던 방식으로 물러선다. - SetDefaultFolder 가 아니라 SetFolder 를 쓴다. 전자는 윈도우가 기억한 폴더를 우선해서 지금 경로 칸에 적힌 폴더에서 열리지 않는다. - D-4(비교 창 여러 개)는 사용자 판단으로 취소. 번호는 그대로 둔다. 확인: 위로 한 번 올라가 목록의 right 폴더를 한 번 눌러 골랐고 경로 칸에 그대로 들어왔다. 그 상태로 비교하니 doc / src / src·core / src·ui 트리가 나오고 src·core·weld.cs 까지 펼쳐진다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
93a507e3e8
commit
b5bd06cb49
@ -44,13 +44,15 @@
|
||||
- A-2 와 원인이 같을 수 있다(옮긴 뒤 다른 내비 버튼이 눌림). 같은 원인이면 함께 정리하고 그렇게 보고한다.
|
||||
- **판정 기준**: 화면 이동으로는 어떤 팝업도 뜨지 않는다.
|
||||
|
||||
### A-5. Git 저장소를 열 때 최상위 폴더를 고를 수 없다
|
||||
### A-5. 폴더 고르는 창에서 상위 폴더를 고를 수 없다
|
||||
|
||||
- 증상: `.git` 을 보려면 저장소 최상위에서 열어야 하는데, 지금은 가장 깊은 폴더만 열리는 식이라 최상위를 고를 수 없다.
|
||||
- 두 가지를 모두 만족시킨다.
|
||||
1. 폴더를 고르는 창에서 최상위 폴더 자체를 고를 수 있다.
|
||||
2. 하위 폴더를 골랐더라도 위로 거슬러 올라가며 `.git` 이 있는 저장소 최상위를 자동으로 찾아 그곳을 연다.
|
||||
- **판정 기준**: 저장소 안 아무 하위 폴더나 골라도 Git 탭이 그 저장소를 정상으로 연다.
|
||||
- 증상: 폴더 비교 탭에서 폴더를 고르면 <b>그 폴더 안으로 들어가야만</b> 선택된다.
|
||||
목록에 보이는 상위 폴더를 눌러서 고를 수가 없어 늘 가장 깊은 폴더만 고르게 된다.
|
||||
상위 폴더를 골라 놓고 하위까지 한꺼번에 비교하는 것이 폴더 비교의 기본 사용법인데 그것이 막힌다.
|
||||
- 윈도우가 원래 가지고 있는 <b>폴더 선택 창</b>을 쓴다. 목록에서 폴더를 한 번 눌러 고를 수 있어야 한다.
|
||||
- 창은 지금 경로 칸에 적힌 폴더에서 연다. 윈도우가 기억한 "마지막으로 본 폴더"에서 열면 엉뚱한 곳에서 시작한다.
|
||||
- 곁들여: Git 탭에서 하위 폴더를 골랐더라도 위로 거슬러 올라가며 `.git` 이 있는 최상위를 찾아 연다.
|
||||
- **판정 기준**: 목록에서 상위 폴더를 한 번 눌러 고를 수 있고, 그 폴더로 비교하면 하위 폴더까지 나온다.
|
||||
|
||||
---
|
||||
|
||||
@ -121,11 +123,9 @@
|
||||
- 큰 폴더에서도 화면이 멈추면 안 된다. 취소할 수 있어야 한다.
|
||||
- **판정 기준**: 결과 목록에서 항목을 고르면 해당 파일이 열리고, 검색 중에도 창이 반응한다.
|
||||
|
||||
### D-4. 비교 창을 여러 개 띄울 수 있게
|
||||
### D-4. 비교 창을 여러 개 띄울 수 있게 — **취소** (2026-09-09)
|
||||
|
||||
- 파일 비교를 하나만 열 수 있는 지금 구조를 여러 개로 늘린다. 탭을 늘리는 방식이 플랫폼과 맞는지 먼저 확인하고, 맞지 않으면 별도 창 방식을 검토한 뒤 어느 쪽인지 적고 시작한다.
|
||||
- 창마다 스크롤 · 편집 · 저장이 서로 섞이지 않아야 한다.
|
||||
- **판정 기준**: 서로 다른 파일 쌍을 세 개 열고 각각 편집·저장해도 내용이 섞이지 않는다.
|
||||
사용자 판단으로 뺀다. 번호는 그대로 둔다 — 뒤 번호를 밀면 앞서 오간 이야기와 어긋난다.
|
||||
|
||||
### D-5. 덩어리 단위 반영
|
||||
|
||||
|
||||
50
doc/진행상황.md
50
doc/진행상황.md
@ -104,7 +104,7 @@ CommunityToolkit 커맨드는 CommandManager 를 구독하지 않는데 이 둘
|
||||
| **완료** | A-2 화면 이동 시 종료·최소화 | 아래 A-2~A-4 에 함께 적음 | 21회 연속 이동 (누름 60·250·600ms) |
|
||||
| **완료** | A-3 파일 비교에서 화면 이동이 원래 모니터로 복귀 | A-2 와 같은 원인 | 파일 비교 탭에서 6회 왕복 |
|
||||
| **완료** | A-4 화면 이동 시 잠금 팝업 | A-2 와 같은 원인 | 팝업 0회 · 잠금/바탕화면/종료 버튼은 그대로 동작 |
|
||||
| **완료** | A-5 Git 저장소 최상위를 고를 수 없음 | 폴더 고르기 창을 바꾸고, 고른 자리에서 위로 올라가 최상위를 찾는다 | 4단계 아래 파일을 골라도 최상위가 열림 · PathTest 12건 추가 |
|
||||
| **완료** | A-5 폴더 고르는 창에서 상위 폴더를 고를 수 없음 | 윈도우 폴더 선택 창으로 바꿈. 곁들여 Git 탭은 최상위를 찾아 연다 | 목록에서 상위 폴더 한 번 눌러 고름 · 상위 폴더로 비교해 하위까지 나옴 · PathTest 12건 추가 |
|
||||
|
||||
### B. 3-Way 화면
|
||||
|
||||
@ -129,41 +129,43 @@ CommunityToolkit 커맨드는 CommandManager 를 구독하지 않는데 이 둘
|
||||
| 대기 | D-1 주석만 다른 파일을 다른 색으로 |
|
||||
| 대기 | D-2 C++ 문법 강조 |
|
||||
| 대기 | D-3 폴더 안 전체 검색 |
|
||||
| 대기 | D-4 비교 창 여러 개 |
|
||||
| ~~취소~~ | ~~D-4 비교 창 여러 개~~ (2026-09-09 사용자 판단으로 뺌) |
|
||||
| 대기 | D-5 덩어리 단위 반영 (2-Way 는 이미 됨 · 3-Way 확인 필요) |
|
||||
| 대기 | D-6 비교 결과 텍스트 내보내기 |
|
||||
| 대기 | D-7 드래그 앤 드롭으로 열기 |
|
||||
|
||||
---
|
||||
|
||||
### A-5. Git 저장소 최상위를 고를 수 없던 문제 — **완료** (2026-09-09)
|
||||
### A-5. 폴더 고르는 창에서 상위 폴더를 고를 수 없던 문제 — **완료** (2026-09-09)
|
||||
|
||||
두 가지가 겹쳐 있었다.
|
||||
**처음에 요구를 잘못 읽었다.** "최상위 단에서 봐야 하는데 가장 깊은 곳에서 폴더 열기밖에 안 된다"를
|
||||
Git 저장소 이야기로 읽고 `.git` 찾아 올라가기를 만들었는데, 실제로는 <b>폴더 비교 탭의
|
||||
폴더 고르는 창</b> 이야기였다. 상위 폴더를 골라 놓고 하위까지 한꺼번에 비교하고 싶은데
|
||||
그 상위 폴더를 고를 방법이 없다는 것이었다.
|
||||
|
||||
**하나 — 폴더 고르는 창이 옛날 것이었다.** Git 탭의 `폴더...` 는 WinForms 의
|
||||
`FolderBrowserDialog` 를 썼는데, net48 에서는 <b>주소 칸이 없는 옛날 트리 창</b>이다.
|
||||
경로를 붙여넣을 수도 없고, 지난번에 골랐던 깊은 폴더가 기억돼 있으면 거기서부터
|
||||
저장소 최상위까지 트리를 손으로 거슬러 올라가야 했다.
|
||||
|
||||
**둘 — 고른 자리만 보고 판단했다.** `.git` 은 저장소 최상위에만 있는데
|
||||
`LooksLikeRepository` 는 고른 폴더 바로 밑만 봤다. 사람은 지금 보고 있던 깊은 폴더를
|
||||
고르기 마련이라, 멀쩡한 저장소를 두고 "저장소가 아니다"가 됐다.
|
||||
**진짜 원인**: 폴더 고르기를 <b>파일 열기 창으로 돌려쓰고</b> 있었다(net48 WPF·WinForms 에는
|
||||
쓸 만한 폴더 선택 창이 없다). 이 방식은 "지금 서 있는 폴더"를 돌려주기 때문에,
|
||||
목록에 보이는 폴더를 고르려면 <b>반드시 그 안으로 들어가야</b> 한다. 그래서 늘 가장 깊은
|
||||
폴더만 골라졌다. 게다가 윈도우가 기억해 둔 "이 프로그램이 마지막으로 본 폴더"에서 열려서
|
||||
엉뚱한 곳(지난번 Git 저장소를 고르러 들어갔던 자리)에서 시작하기도 했다.
|
||||
|
||||
**고친 것**
|
||||
|
||||
- `Services/FolderPicker.cs` 신설. 폴더 고르기를 한 군데로 모았다(폴더 비교 왼쪽·오른쪽,
|
||||
Git 저장소 경로, 변경분 추출 대상 폴더 — 네 자리가 같은 것을 쓴다).
|
||||
주소 칸이 있어 경로를 붙여넣을 수 있고, 파일 이름 칸을 그대로 둔 채 열기를 누르면
|
||||
<b>지금 보고 있는 폴더</b>가 선택된다. 최상위든 어디든 한 번에 갈 수 있다.
|
||||
- `PathUtil.FindRepositoryRoot` 신설. 고른 자리에서 <b>위로 거슬러 올라가며</b> `.git` 을 찾는다.
|
||||
워크트리·서브모듈은 `.git` 이 폴더가 아니라 <b>파일</b>이라 둘 다 본다.
|
||||
안쪽에 저장소가 또 있으면 가장 가까운 것을 잡는다.
|
||||
- Git 탭에서 폴더를 고르면 그 자리에서 최상위로 바로잡아 연다. 시작할 때의 자동 열기도
|
||||
같은 규칙을 쓰므로, 설정에 하위 폴더가 저장돼 있어도 이제 열린다.
|
||||
- 윈도우가 원래 가지고 있는 <b>폴더 선택 창</b>을 셸 COM(`IFileDialog` + `FOS_PICKFOLDERS`)으로
|
||||
직접 부른다. 목록에서 폴더를 <b>한 번 눌러 고를 수 있고</b>, 주소 칸도 있고, 경로를 쳐 넣을 수도 있다.
|
||||
COM 이 안 되는 환경이 있을 수 있어 그때는 전에 쓰던 파일 열기 창으로 물러선다.
|
||||
- `SetDefaultFolder` 가 아니라 `SetFolder` 를 쓴다 — 전자는 윈도우가 기억한 폴더를 우선하기 때문에
|
||||
지금 경로 칸에 적힌 폴더에서 열리지 않는다.
|
||||
- 네 자리(폴더 비교 왼쪽·오른쪽, Git 저장소 경로, 변경분 추출 대상)가 이 창 하나를 쓴다.
|
||||
|
||||
**확인**: `src\MergeHub\Views\GitView.xaml`(최상위에서 네 단계 아래)을 골랐더니
|
||||
경로가 `D:\Sorce\MergeTool\MergeHub\` 로 바로잡히고 저장소가 열렸다
|
||||
(`HEAD master af27800 · Working Tree 6 files`). `PathTest` 에 12건 추가(31 → 43건). 전체 **399건**.
|
||||
**곁들여**: Git 탭은 하위 폴더를 골랐더라도 위로 거슬러 올라가 `.git` 이 있는 최상위를 찾아 연다
|
||||
(`PathUtil.FindRepositoryRoot`). 워크트리·서브모듈은 `.git` 이 파일이라 둘 다 보고,
|
||||
안쪽에 저장소가 또 있으면 가장 가까운 것을 잡는다. 시작할 때의 자동 열기도 같은 규칙을 쓴다.
|
||||
|
||||
**확인**: 폴더 고르기 창을 열어 `위로` 한 번 올라간 뒤 목록의 `right` 폴더를 <b>한 번 눌러</b> 골랐고,
|
||||
경로 칸에 그대로 들어왔다. 그 상태로 비교하니 `doc / src / src·core / src·ui` 가 트리로 나오고
|
||||
`src·core·weld.cs` 까지 펼쳐진다. Git 탭은 최상위에서 네 단계 아래 파일을 골라도 저장소가 열린다.
|
||||
`PathTest` 에 12건 추가(31 → 43건). 전체 **399건**.
|
||||
---
|
||||
|
||||
### A-2 · A-3 · A-4. 화면 이동 결함 세 가지 — **완료** (2026-09-09)
|
||||
|
||||
@ -1,21 +1,110 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows;
|
||||
using System.Windows.Interop;
|
||||
|
||||
namespace MergeHub.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 폴더 하나를 고르는 대화상자. 세 군데(폴더 비교 왼쪽·오른쪽, Git 저장소 경로)가 같은 것을 쓴다.
|
||||
/// 폴더 하나를 고르는 창. 네 자리(폴더 비교 왼쪽·오른쪽, Git 저장소 경로, 변경분 추출 대상)가 같은 것을 쓴다.
|
||||
///
|
||||
/// net48 WPF 에는 폴더 전용 대화상자가 없다. WinForms 의 <c>FolderBrowserDialog</c> 는
|
||||
/// net48 에서 <b>옛날 트리 창</b>이라 주소 칸이 없고 경로를 붙여넣을 수도 없어서,
|
||||
/// 깊은 폴더가 기억돼 있으면 저장소 최상위까지 거슬러 올라가기가 번거롭다.
|
||||
/// 그래서 파일 열기 대화상자를 폴더 고르기로 쓴다 — 주소 칸이 있고, 경로를 붙여넣을 수 있고,
|
||||
/// 파일 이름 칸을 그대로 둔 채 열기를 누르면 <b>지금 보고 있는 폴더</b>가 선택된다.
|
||||
/// 윈도우가 원래 가지고 있는 <b>폴더 선택 창</b>(탐색기에서 "폴더 선택"이라고 뜨는 그것)을 부른다.
|
||||
/// 목록에 보이는 폴더를 <b>눌러서 그대로 고를 수 있어야</b> 하기 때문이다 -
|
||||
/// 상위 폴더를 골라 놓고 하위까지 한꺼번에 비교하는 것이 폴더 비교의 기본 사용법인데,
|
||||
/// 그 폴더 안으로 들어가야만 골라지면 늘 가장 깊은 폴더만 고르게 된다.
|
||||
///
|
||||
/// net48 WPF·WinForms 에는 이 창을 부르는 것이 없어 셸 COM 을 직접 쓴다.
|
||||
/// (WinForms 의 FolderBrowserDialog 는 주소 칸도 없는 옛날 트리 창이고,
|
||||
/// 파일 열기 창을 폴더 고르기로 돌려쓰는 방법은 위에 적은 "들어가야만 골라지는" 문제가 있다.)
|
||||
/// COM 이 안 되는 환경이 있을 수 있으므로 그때는 파일 열기 창으로 물러선다.
|
||||
/// </summary>
|
||||
public static class FolderPicker
|
||||
{
|
||||
/// <summary>고른 폴더의 전체 경로. 취소하면 null.</summary>
|
||||
public static string? Pick(string title, string startFolder)
|
||||
{
|
||||
var start = PathUtil.FullFolderPath(startFolder);
|
||||
|
||||
try
|
||||
{
|
||||
return PickWithShell(title, start);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// 셸 폴더 선택 창을 못 열었다. 고르기 자체를 못 하게 되는 것보다는 낫다.
|
||||
return PickWithFileDialog(title, start);
|
||||
}
|
||||
}
|
||||
|
||||
// ===================== 윈도우 폴더 선택 창 =====================
|
||||
|
||||
private static string? PickWithShell(string title, string start)
|
||||
{
|
||||
var dialog = (IFileDialog)new FileOpenDialogRcw();
|
||||
|
||||
dialog.GetOptions(out var options);
|
||||
dialog.SetOptions(options | FOS_PICKFOLDERS | FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST);
|
||||
dialog.SetTitle(title);
|
||||
dialog.SetOkButtonLabel("이 폴더 선택");
|
||||
|
||||
if (start.Length > 0 && TryCreateItem(start, out var startItem))
|
||||
{
|
||||
// SetDefaultFolder 가 아니라 SetFolder 를 쓴다. SetDefaultFolder 는 윈도우가
|
||||
// 기억해 둔 "이 프로그램이 마지막으로 본 폴더"가 있으면 그쪽을 쓰기 때문에,
|
||||
// 엉뚱한 곳(지난번에 Git 저장소를 고르러 들어갔던 깊은 폴더 같은)에서 열린다.
|
||||
// 지금 칸에 적힌 폴더에서 여는 것이 맞다.
|
||||
dialog.SetFolder(startItem!);
|
||||
}
|
||||
|
||||
var hr = dialog.Show(OwnerHandle());
|
||||
if (hr == HRESULT_CANCELLED) return null;
|
||||
if (hr != 0) Marshal.ThrowExceptionForHR(hr);
|
||||
|
||||
dialog.GetResult(out var picked);
|
||||
if (picked == null) return null;
|
||||
|
||||
picked.GetDisplayName(SIGDN_FILESYSPATH, out var buffer);
|
||||
try
|
||||
{
|
||||
var path = Marshal.PtrToStringUni(buffer);
|
||||
return string.IsNullOrEmpty(path) ? null : path;
|
||||
}
|
||||
finally
|
||||
{
|
||||
Marshal.FreeCoTaskMem(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
private static bool TryCreateItem(string path, out IShellItem? item)
|
||||
{
|
||||
var iid = typeof(IShellItem).GUID;
|
||||
item = SHCreateItemFromParsingName(path, IntPtr.Zero, ref iid, out var created) == 0 ? created : null;
|
||||
return item != null;
|
||||
}
|
||||
|
||||
private static IntPtr OwnerHandle()
|
||||
{
|
||||
var window = Application.Current?.MainWindow;
|
||||
if (window == null) return IntPtr.Zero;
|
||||
|
||||
try
|
||||
{
|
||||
return new WindowInteropHelper(window).Handle;
|
||||
}
|
||||
catch (InvalidOperationException)
|
||||
{
|
||||
return IntPtr.Zero;
|
||||
}
|
||||
}
|
||||
|
||||
// ===================== 물러설 자리 =====================
|
||||
|
||||
/// <summary>
|
||||
/// 셸 창을 못 쓸 때. 파일 열기 창을 폴더 고르기로 돌려쓴다 -
|
||||
/// 파일 이름 칸을 그대로 두고 열기를 누르면 지금 보고 있는 폴더가 선택된다.
|
||||
/// </summary>
|
||||
private static string? PickWithFileDialog(string title, string start)
|
||||
{
|
||||
var dialog = new Microsoft.Win32.OpenFileDialog
|
||||
{
|
||||
@ -26,30 +115,93 @@ namespace MergeHub.Services
|
||||
Filter = "폴더 (*.*)|*.*"
|
||||
};
|
||||
|
||||
// 시작 폴더는 반드시 PathUtil 을 거친다. 슬래시가 섞인 경로("C:/a/b")를 그대로 넘기면
|
||||
// 시작 폴더는 반드시 PathUtil 을 거친 값이어야 한다. 슬래시가 섞인 경로를 그대로 넘기면
|
||||
// ShowDialog() 안쪽에서 ArgumentException 이 나고 프로그램이 죽는다. PathUtil.cs 참고.
|
||||
var start = PathUtil.FullFolderPath(startFolder);
|
||||
if (start.Length > 0) dialog.InitialDirectory = start;
|
||||
|
||||
if (!Show(dialog)) return null;
|
||||
bool ok;
|
||||
try
|
||||
{
|
||||
ok = dialog.ShowDialog() == true;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
dialog.InitialDirectory = string.Empty;
|
||||
ok = dialog.ShowDialog() == true;
|
||||
}
|
||||
|
||||
if (!ok) return null;
|
||||
|
||||
var picked = Path.GetDirectoryName(dialog.FileName);
|
||||
return string.IsNullOrEmpty(picked) ? null : picked;
|
||||
}
|
||||
|
||||
private static bool Show(Microsoft.Win32.OpenFileDialog dialog)
|
||||
// ===================== 셸 COM 선언 =====================
|
||||
|
||||
private const uint FOS_PICKFOLDERS = 0x00000020;
|
||||
private const uint FOS_FORCEFILESYSTEM = 0x00000040;
|
||||
private const uint FOS_PATHMUSTEXIST = 0x00000800;
|
||||
private const uint SIGDN_FILESYSPATH = 0x80058000;
|
||||
|
||||
/// <summary>사용자가 취소했을 때의 HRESULT(ERROR_CANCELLED).</summary>
|
||||
private const int HRESULT_CANCELLED = unchecked((int)0x800704C7);
|
||||
|
||||
[DllImport("shell32.dll", CharSet = CharSet.Unicode, PreserveSig = false)]
|
||||
private static extern int SHCreateItemFromParsingName(
|
||||
[MarshalAs(UnmanagedType.LPWStr)] string path, IntPtr bindContext, ref Guid riid,
|
||||
[MarshalAs(UnmanagedType.Interface)] out IShellItem item);
|
||||
|
||||
[ComImport, Guid("DC1C5A9C-E88A-4dde-A5A1-60F82A20AEF7")]
|
||||
private class FileOpenDialogRcw
|
||||
{
|
||||
try
|
||||
{
|
||||
return dialog.ShowDialog() == true;
|
||||
}
|
||||
catch (Exception)
|
||||
|
||||
/// <remarks>
|
||||
/// 메서드 <b>순서가 곧 규약</b>이다(IModalWindow 를 이어받는다). 하나라도 빼거나 순서를 바꾸면
|
||||
/// 엉뚱한 함수가 불려 프로그램이 죽는다. 쓰지 않는 것도 자리를 채워 둔다.
|
||||
/// </remarks>
|
||||
[ComImport, Guid("42f85136-db7e-439c-85f1-e4075d135fc8"),
|
||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
||||
private interface IFileDialog
|
||||
{
|
||||
// 정규화로 걸러지지 않는 시작 폴더가 남는다(끊긴 네트워크 드라이브 등).
|
||||
// 폴더 고르기 자체를 못 쓰게 되는 것보다 기본 위치에서 다시 여는 편이 낫다.
|
||||
dialog.InitialDirectory = string.Empty;
|
||||
return dialog.ShowDialog() == true;
|
||||
// IModalWindow
|
||||
[PreserveSig] int Show(IntPtr parent);
|
||||
|
||||
// IFileDialog
|
||||
void SetFileTypes(uint fileTypes, IntPtr filterSpec);
|
||||
void SetFileTypeIndex(uint fileType);
|
||||
void GetFileTypeIndex(out uint fileType);
|
||||
void Advise(IntPtr events, out uint cookie);
|
||||
void Unadvise(uint cookie);
|
||||
void SetOptions(uint options);
|
||||
void GetOptions(out uint options);
|
||||
void SetDefaultFolder(IShellItem folder);
|
||||
void SetFolder(IShellItem folder);
|
||||
void GetFolder(out IShellItem folder);
|
||||
void GetCurrentSelection(out IShellItem item);
|
||||
void SetFileName([MarshalAs(UnmanagedType.LPWStr)] string name);
|
||||
void GetFileName([MarshalAs(UnmanagedType.LPWStr)] out string name);
|
||||
void SetTitle([MarshalAs(UnmanagedType.LPWStr)] string title);
|
||||
void SetOkButtonLabel([MarshalAs(UnmanagedType.LPWStr)] string text);
|
||||
void SetFileNameLabel([MarshalAs(UnmanagedType.LPWStr)] string label);
|
||||
void GetResult(out IShellItem item);
|
||||
void AddPlace(IShellItem place, int order);
|
||||
void SetDefaultExtension([MarshalAs(UnmanagedType.LPWStr)] string extension);
|
||||
void Close([MarshalAs(UnmanagedType.Error)] int result);
|
||||
void SetClientGuid(ref Guid client);
|
||||
void ClearClientData();
|
||||
void SetFilter(IntPtr filter);
|
||||
}
|
||||
|
||||
[ComImport, Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe"),
|
||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
||||
private interface IShellItem
|
||||
{
|
||||
void BindToHandler(IntPtr bindContext, ref Guid handler, ref Guid riid, out IntPtr result);
|
||||
void GetParent(out IShellItem parent);
|
||||
void GetDisplayName(uint kind, out IntPtr name);
|
||||
void GetAttributes(uint mask, out uint attributes);
|
||||
void Compare(IShellItem other, uint hint, out int order);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user