ERRO NA CHAMADA DA API EM 32 BITES
Alguem pode me ajudar e me dizer por que essa função funciona correto quando executada em plataforma AnyCPU
Quando tento compilar na plataforma x86 retorna esse erro:
System.AccessViolationException: 'Tentativa de leitura ou gravação em memória protegida. Normalmente, isso é uma indicação de que outra memória está danificada.'
//Essa rotina tem a função de remover toos os checkbox de um treeview que não são a extremidade do nó
private void HideCheckBox(TreeView tvw, TreeNode node) {
TVITEM tvi = new TVITEM();
tvi.hItem = node.Handle;
tvi.mask = TVIF_STATE;
tvi.stateMask = TVIS_STATEIMAGEMASK;
tvi.state = 0;
SendMessage(tvw.Handle, TVM_SETITEM, IntPtr.Zero, tvi); //Aqui ocorre o erro
}
//Declarações
public struct TVITEM {
public int mask;
public IntPtr hItem;
public int state;
public int stateMask;
public string lpszText;
public int cchTextMax;
public int iImage;
public int iSelectedImage;
public int cChildren;
public IntPtr lParam;
}
public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, TVITEM lParam);
Quando tento compilar na plataforma x86 retorna esse erro:
System.AccessViolationException: 'Tentativa de leitura ou gravação em memória protegida. Normalmente, isso é uma indicação de que outra memória está danificada.'
//Essa rotina tem a função de remover toos os checkbox de um treeview que não são a extremidade do nó
private void HideCheckBox(TreeView tvw, TreeNode node) {
TVITEM tvi = new TVITEM();
tvi.hItem = node.Handle;
tvi.mask = TVIF_STATE;
tvi.stateMask = TVIS_STATEIMAGEMASK;
tvi.state = 0;
SendMessage(tvw.Handle, TVM_SETITEM, IntPtr.Zero, tvi); //Aqui ocorre o erro
}
//Declarações
public struct TVITEM {
public int mask;
public IntPtr hItem;
public int state;
public int stateMask;
public string lpszText;
public int cchTextMax;
public int iImage;
public int iSelectedImage;
public int cChildren;
public IntPtr lParam;
}
public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, TVITEM lParam);
Nossa, certamente esse é um jeito muito esquisito. Quem sabe você explica direitinho o que quer fazer. Se o treeview está na sua aplicação, certamente você tem total controle sobre ele, o que elinima a necessidade de usar uma API pra isso.
Alterado em 11/01/2024 14:14:57
Quero remover todas as checkbox da linha para os itens. Quero deixar o checkbox somente no último item de cada elemento
Não conheço um modo de fazer isso pelo próprio controle
Não conheço um modo de fazer isso pelo próprio controle
Faça um override do draw, aqui mostra mais ou menos
Pessoal
Resolvido o problema. Foi só mudar essas duas linhas
public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref TVITEM lParam);
e
SendMessage(node.TreeView.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi);
Resolvido o problema. Foi só mudar essas duas linhas
public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref TVITEM lParam);
e
SendMessage(node.TreeView.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi);
Tudo funcionando certinho
Tópico encerrado , respostas não são mais permitidas