1 / 1 / 0
Регистрация: 07.04.2015
Сообщений: 338
1

Иероглифы вместо текста

17.07.2018, 08:48. Показов 1921. Ответов 9
Метки нет (Все метки)

Здравствуйте. Есть код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Runtime.InteropServices;
 
 
 
 
 
/// <summary>
 
/// Класс обертка для WinAPI
 
/// </summary>
 
public static class WinAPI
 
{
 
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string lclassName, string windowTitle);
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
 
    [DllImport("user32.dll", SetLastError = true)]
 
    public static extern IntPtr GetWindow(IntPtr HWnd, GetWindow_Cmd cmd);
 
 
 
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
 
    public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, [Out] StringBuilder lParam);
 
 
 
    public enum GetWindow_Cmd : uint
 
    {
 
        GW_HWNDFIRST = 0,
 
        GW_HWNDLAST = 1,
 
        GW_HWNDNEXT = 2,
 
        GW_HWNDPREV = 3,
 
        GW_OWNER = 4,
 
        GW_CHILD = 5,
 
        GW_ENABLEDPOPUP = 6,
 
        WM_GETTEXT = 0x000D
 
    }
 
}
 
 
 
namespace WpfApp3
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void button_click(object sender, EventArgs e)
 
        {
 
            IntPtr ptr = WinAPI.FindWindow(null, "MainWindow");
 
            //Если окно найдено, то отбращаемся к его дочерним объектам
 
            if (ptr.ToInt32() != 0)
 
            {
 
                IntPtr[] child = new IntPtr[15];
 
                child[0] = WinAPI.GetWindow(ptr, WinAPI.GetWindow_Cmd.GW_CHILD);
 
                StringBuilder title = new StringBuilder();
 
                for (int i = 1; i <= 5; i++)
 
                {
 
                    child[i] = WinAPI.GetWindow(ptr, WinAPI.GetWindow_Cmd.GW_HWNDNEXT);
 
                    WinAPI.SendMessage(child[i - 1], Convert.ToInt32(WinAPI.GetWindow_Cmd.WM_GETTEXT), (IntPtr)20, title);
 
                    treeView.Items.Add(title.ToString());
                    
                   
                    
 
                }
 
            }
 
        }
    }
}
Почему вместо обычного нормального текста в элемент TreeView добавляются иероглифы?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.07.2018, 08:48
Ответы с готовыми решениями:

В GridViewColumn добавить кнопку ссылкой вместо текста и действием
Есть Listview,который заполняется циклом foreach. Нужно в GridViewColumn с названием &quot;Проиграть&quot;...

Парсинг русского текста с сайта. Неизвестные символы вместо кириллицы
С помощью WebRequest запрашиваю html код страницы, но вместо русских букв там крокозябры. Пробовал...

Иероглифы вместо текста
Привет, есть метод char *FirstDlg::StateToString() { char buff_s; _snprintf(buff_s, 30,...

Иероглифы вместо текста
Всем привет. Помогите пожалуйста, только начал изучать html и столкнулся с проблемой. Приступил к...

9
14 / 14 / 7
Регистрация: 02.07.2016
Сообщений: 34
17.07.2018, 09:37 2
Возможно причина в кодировке.
Попробуйте версию функции с поддержкой юникода SendMessageW.
0
1 / 1 / 0
Регистрация: 07.04.2015
Сообщений: 338
17.07.2018, 10:13  [ТС] 3
Не нашел функцию SendMessageW на pinvoke.net.
0
Администратор
Эксперт .NET
15372 / 12383 / 4936
Регистрация: 17.03.2014
Сообщений: 25,099
Записей в блоге: 1
17.07.2018, 11:53 4
asdfg15432, нужно выделить буфер для строки
C#
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
                /* ! */ StringBuilder title = new StringBuilder(20);
 
                for (int i = 1; i <= 5; i++)
 
                {
 
                    child[i] = WinAPI.GetWindow(ptr, WinAPI.GetWindow_Cmd.GW_HWNDNEXT);
 
                    /* ! */ WinAPI.SendMessage(child[i - 1], Convert.ToInt32(WinAPI.GetWindow_Cmd.WM_GETTEXT), (IntPtr)title.Capacity, title);
 
                    treeView.Items.Add(title.ToString());
                    
                   
                    
 
                }
0
14 / 14 / 7
Регистрация: 02.07.2016
Сообщений: 34
17.07.2018, 12:16 5
Ответ выше.
0
1 / 1 / 0
Регистрация: 07.04.2015
Сообщений: 338
17.07.2018, 14:45  [ТС] 6
Все равно в TreeView выходят иероглифы.

Добавлено через 1 час 1 минуту
Решение проблемы на C++ я нашел. На C# - нет.
0
Администратор
Эксперт .NET
15372 / 12383 / 4936
Регистрация: 17.03.2014
Сообщений: 25,099
Записей в блоге: 1
17.07.2018, 14:48 7
asdfg15432, выложи решение на C++
0
1 / 1 / 0
Регистрация: 07.04.2015
Сообщений: 338
17.07.2018, 15:29  [ТС] 8
Первый вариант решения:
C++
1
SendMessage (hComboBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox"); //иероглифы
C++
1
SendMessage (hComboBox, CB_ADDSTRING, 0, (LPARAM)_T("ComboBox"));//нормальный текст
Второй(похожая проблема, с другого форума):
Есть код:
C++
1
2
3
4
5
6
HWND stbar = CreateWindowExW(0, STATUSCLASSNAME, L"", WS_VISIBLE | WS_CHILD | SBARS_SIZEGRIP,
                            0, 0, 0, 0, hWnd, 0, hInst, NULL);
int parts[2] = { LOWORD(lParam)/ 2, LOWORD(lParam) };
SendMessage(stbar, SB_SETPARTS, 2, (LPARAM)parts);
SendMessage(stbar, SB_SETTEXT,  0, (LONG)"Text");
SendMessage(stbar, SB_SETTEXT,  1, (LONG)"123");
"Но вместо нужного текста в ячейках строки состояния выводятся иероглифы".
Было предложено следующее решение:
"Судя по
C++
1
L""
ваша программа использует юникод. А в lparam вы передаете указатель на ASCII-строки. Попробуйте и в SendMessage использовать
C++
1
(LONG)L"Text"
."
И автор сообщения отписался, что проблема решилась.
0
14 / 14 / 7
Регистрация: 02.07.2016
Сообщений: 34
18.07.2018, 11:55 9
C#
1
2
3
4
StringBuilder title = new StringBuilder(65535);
            IntPtr ptr = WinAPI.FindWindow(null, "MainWindow"); //Верхнее окно
            WinAPI.SendMessage(ptr, Convert.ToUInt32(WinAPI.GetWindow_Cmd.WM_GETTEXT), (IntPtr)title.Capacity, title);
            treeView.Items.Add(title.ToString());
Работает полностью.
Однако стоит уточнить один момент, а к каким это дочерним объектам вы пытаетесь обратиться, если используете функцию SendMessage???
0
1 / 1 / 0
Регистрация: 07.04.2015
Сообщений: 338
18.07.2018, 16:20  [ТС] 10
Debasher, я обращаюсь к дочерним элементам главного окна(меня интересуют кнопки) и пытаюсь получить их Content.
Миниатюры
Иероглифы вместо текста  
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.07.2018, 16:20
Помогаю со студенческими работами здесь

Иероглифы вместо текста
Пытаюсь получить текст из lpName, получаю в ответ иероглифы шумерских цивилизайций! Сил больше нет,...

Иероглифы вместо текста !
Парни может я не по адресу , но всё же может кто обьяснит , можно ли преобразовать это в нормальный...

Вместо текста иероглифы
оффисс 2007. Виндоус 7 SP1/ Помогите

Иероглифы вместо текста
в едит вывожу чаровский текс с помощью функции SetWindowText но он у меня выводит иероглифы , что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru