Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 如何获得工具栏按钮的手柄?_Winapi - Fatal编程技术网

Winapi 如何获得工具栏按钮的手柄?

Winapi 如何获得工具栏按钮的手柄?,winapi,Winapi,我想要一个工具栏按钮的手柄。我知道它的ID和工具栏按钮所在的窗口句柄。但是GetDlgItem函数似乎不适用于工具栏按钮 GetDlgItem(windowHandle, buttonID); 我想可能带有正确参数的函数SendMessage()可以获得句柄,但我没有找到任何msg参数可以帮助实现这一点 什么函数可以帮助我获得它的句柄?工具栏按钮是非窗口的。没有可供您检索的窗口句柄 如果您希望自动化工具栏按钮,那么您应该使用。工具栏按钮没有手柄(它们不像常规按钮那样是窗口)。有很多工具栏消息

我想要一个工具栏按钮的手柄。我知道它的ID和工具栏按钮所在的窗口句柄。但是GetDlgItem函数似乎不适用于工具栏按钮

 GetDlgItem(windowHandle, buttonID);
我想可能带有正确参数的函数SendMessage()可以获得句柄,但我没有找到任何msg参数可以帮助实现这一点


什么函数可以帮助我获得它的句柄?

工具栏按钮是非窗口的。没有可供您检索的窗口句柄


如果您希望自动化工具栏按钮,那么您应该使用。

工具栏按钮没有手柄(它们不像常规按钮那样是窗口)。有很多工具栏消息(TB_*)可以使用这些按钮

提及

您可以发送TB_BUTTONCOUNT消息以获取工具栏中的按钮计数,并创建一个简单的循环,该循环通过发送TB_ISBUTTONENABLED检查是否已取消。您还可以发送TB_GETBUTTON消息,以获取有关TBBUTTON中每个按钮的更多信息。两种方式:

1:自己创建按钮

INT_PTR CALLBACK myModelessToolbar(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
        case WM_INITDIALOG:
        {
            HWND hYellowButton =
              CreateWindow(L"BUTTON",
                           L"Yellow button",
                           BS_ICON | WS_VISIBLE | WS_CHILD,
                           610, 0, 20, 20, hDlg, (HMENU)1, NULL, NULL);

            m_pBitmap = Gdiplus::Bitmap::FromFile(L"Yellow.jpg"); // Image must be in executable directory.
            m_pBitmap->GetHICON(&hicon);
            LRESULT lr = SendMessage(hYellowButton, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hicon);

            return (INT_PTR)TRUE;
        }
    }
}
2:使用Visual Studio编辑器,设置按钮以接收位图。这对我也很管用。把它也放到wm_initdialog部分

HWND test = GetDlgItem(hDlg, IDC_BUTTON8);
lr = SendMessage(test, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hicon);

哦,好吧,那我怎么点击一个特定的工具栏按钮呢?我的意思是我想过使用SendMessage(windowHandle,Msg,诸如此类)。。。但是我找不到合适的Msg和其他参数来完成这项工作。BN_CLICK似乎不起作用,因为它需要按钮的手柄,这就是为什么我要工具栏按钮的手柄:p这是另一个问题。我建议您使用UI自动化。您可以发送这些消息,但它需要
WriteProcessMemory
ReadProcessMemory
。除非我大错特错,否则它们不是跨过程的。那么,我可以使用什么msgs或其他功能来点击程序2中的工具栏按钮呢?你可以按照我刚才说的方式来做。您可以使用UI自动化。我们一直在告诉你。总有一天你会相信我们的!!Theree必须是一个功能型的花花公子。。。。SendMessage()。。。。带着所有人的信息。我的意思是我找到了TB_PRESSBUTTON信息,但即使我按下按钮,窗口也不会出现。我是超级亲密的lol。是的,我尊重UI自动化一定很棒的事实,但是,如果有一个函数用于我的目的,那么尝试查找它要比跳转到一个新的函数方便得多library@DavidHeffernan:那么,为什么不展示一下使用UIAutomation和
TB\u GETBUTTON
/
TB\u button
来按下工具栏按钮的示例,让我们来比较一下。