GVKun编程网logo

如何在Windows上使用3个参数创建全局热键?(如何在windows上使用3个参数创建全局热键)

8

如果您对如何在Windows上使用3个参数创建全局热键?和如何在windows上使用3个参数创建全局热键感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解如何在Windows上使用3个参数创建全局

如果您对如何在Windows上使用3个参数创建全局热键?如何在windows上使用3个参数创建全局热键感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解如何在Windows上使用3个参数创建全局热键?的各种细节,并对如何在windows上使用3个参数创建全局热键进行深入的分析,此外还有关于delphi – 找出哪个进程注册了全局热键? (Windows API)、remote – 如何在Windows上使用IPMI?、windows-7 – 如何在Windows7上使用tscon?、可可 – 如何在OS X应用程序中使用Swift监听全局热键?的实用技巧。

本文目录一览:

如何在Windows上使用3个参数创建全局热键?(如何在windows上使用3个参数创建全局热键)

如何在Windows上使用3个参数创建全局热键?(如何在windows上使用3个参数创建全局热键)

就像Ctl,Alt +删除一样

我想编写一个程序,该程序在python中使用带有3个或更多参数的全局热键。仅当我按下键盘上的所有三个键时,分配的功能才应执行。例如alt,windows和F3。

win32con.VK_F3, win32con.MOD_WIN, win32con.VK_F5

这是我要运行的当前程序,但是其输出是:

Traceback (most recent call last): File "C:\Python32\Syntax\hot keys\hotkeys2.py", line 41, in <module>   for id, (vk, modifiers) in HOTKEYS.items ():ValueError: too many values to unpack (expected 2)

该程序:

import osimport sysimport ctypesfrom ctypes import wintypesimport win32conbyref = ctypes.byrefuser32 = ctypes.windll.user32HOTKEYS = {  1 : (win32con.VK_F3, win32con.MOD_WIN, win32con.VK_F5),  2 : (win32con.VK_F4, win32con.MOD_WIN),  3 : (win32con.VK_F2, win32con.MOD_WIN)    }    def handle_win_f3 ():  #os.startfile (os.environ[''TEMP''])  print ("Hello WOrld! F3")def handle_win_f4 ():  #user32.PostQuitMessage (0)    print ("Hello WOrld! F4")def handle_win_f1_escape ():    print("exit")    sys.exit()HOTKEY_ACTIONS = {  1 : handle_win_f3,  2 : handle_win_f4,  3 : handle_win_f1_escape}for id, (vk, modifiers) in HOTKEYS.items ():  print ("Registering id", id, "for key", vk)  if not user32.RegisterHotKey (None, id, modifiers, vk):    print ("Unable to register id", id)try:  msg = wintypes.MSG ()  while user32.GetMessageA (byref (msg), None, 0, 0) != 0:    if msg.message == win32con.WM_HOTKEY:      action_to_take = HOTKEY_ACTIONS.get (msg.wParam)      #print(" msg.message == win32con.WM_HOTKEY:")      if action_to_take:        action_to_take ()    user32.TranslateMessage (byref (msg))    user32.DispatchMessageA (byref (msg))finally:  for id in HOTKEYS.keys ():    user32.UnregisterHotKey (None, id)    print("user32.UnregisterHotKey (None, id)")

正在注册3个热键?可能? 说明如何使用一种方法,分配一个需要按下的键,然后分配是否需要按下两个键。但是我不会说该功能仅在同时按下所有功能时才执行。我拿了

答案1

小编典典

对于初学者,如果您需要alt,windows和F3,是否不需要使用win32con.VK_F3, win32con.MOD_ALT,win32con.MOD_WINHOTKEYS条目?

但是,F3Win and F5键的修饰符来表示按下并没有什么意义。

错误就行了:

for id, (vk, modifiers) in HOTKEYS.items ():

这是因为每个字典条目的值都是可变长度tuple。这是一种处理所有修饰符值也进行按位 或运算
的方法,以准备将它们作为单个参数传递给RegisterHotKey()

from functools import reducefor id, values in HOTKEYS.items ():    vk, modifiers = values[0], reduce (lambda x, y: x | y, values[1:])    print ("Registering id", id, "for key", vk)    if not user32.RegisterHotKey (None, id, modifiers, vk):        print ("Unable to register id", id)

如果您的代码正确缩进并遵循PEP
8-Python代码样式指南的建议,解决问题会更容易。请考虑在将来这样做。

delphi – 找出哪个进程注册了全局热键? (Windows API)

delphi – 找出哪个进程注册了全局热键? (Windows API)

就我已经能够找到,Windows不提供一个API函数来告诉哪个应用程序注册了一个全局热键(通过RegisterHotkey)。我只能发现,如果RegisterHotkey返回false,但不是“拥有”热键的热键注册。

在没有直接API的情况下,可能有一个迂回的方式吗? Windows维护与每个注册的热键相关的句柄 – 这是一个令人不安的,应该没有办法得到这个信息。

可能无法工作的示例:send(模拟)注册的热键,然后拦截Windows将发送到注册它的进程的热键消息。首先,我不认为拦截消息会显示目标窗口句柄。第二,即使有可能,这将是一件坏事,因为发送热键将触发各种程序的各种可能不需要的活动。

这是没有什么关键,但我已经看到频繁的请求这样的功能,并且我自己是注册热键的应用程序的受害者,甚至没有在UI或文档中的任何地方公开。

(在Delphi工作,只是一个学徒在WinAPI,请温柔。)

解决方法

你的问题引起了我的兴趣,所以我做了一些挖掘,虽然,不幸的是我没有一个适当的答案,我想我会分享我有。

我发现这个example of creating keyboard hook (in Delphi)写在1998年,但是可编译在德尔福2007年与几个调整。

它是一个DLL,通过调用SetwindowsHookEx传递一个回调函数,然后可以拦截键击:在这种情况下,它修改他们的乐趣,将左光标更改为右等等。一个简单的应用程序,然后调用DLL和报告返回其基于TTimer事件的结果。如果你有兴趣,我可以发布基于Delphi 2007的代码。

它有良好的文件和评论,你可能可以使用它作为一个基础的工作,一个按键的地方。如果你可以得到发送键击的应用程序的句柄,你可以跟踪它的方式。有了这个句柄,你将能够很容易地获得你需要的信息。

其他应用程序已尝试通过其快捷方式确定热键,因为它们可以包含快捷键,这只是另一个热键术语。然而,大多数应用程序不倾向于设置此属性,因此它可能不会返回太多。如果您对该路由感兴趣,Delphi可以访问IShellLink COM接口,您可以使用该接口从其加载快捷方式并获取其热键:

uses ShlObj,ComObj,ShellAPI,ActiveX,CommCtrl;

procedure GetShellLinkHotKey;
var
  LinkFile : WideString;
  SL: IShellLink;
  PF: IPersistFile;

  HotKey : Word;
  HotKeyMod: Byte;
  HotKeyText : string;
begin
  LinkFile := 'C:\Temp\Temp.lnk';

  OleCheck(CoCreateInstance(CLSID_ShellLink,nil,CLSCTX_INPROC_SERVER,IShellLink,SL));

  // The IShellLink implementer must also support the IPersistFile
  // interface. Get an interface pointer to it.
  PF := SL as IPersistFile;

  // Load file into IPersistFile object
  OleCheck(PF.Load(PWideChar(LinkFile),STGM_READ));

  // Resolve the link by calling the Resolve interface function.
  OleCheck(SL.Resolve(0,SLR_ANY_MATCH or SLR_NO_UI));

  // Get hotkey info
  OleCheck(SL.GetHotKey(HotKey));

  // Extract the HotKey and Modifier properties.
  HotKeyText := '';
  HotKeyMod := Hi(HotKey);

  if (HotKeyMod and HOTKEYF_ALT) = HOTKEYF_ALT then
    HotKeyText := 'ALT+';
  if (HotKeyMod and HOTKEYF_CONTROL) = HOTKEYF_CONTROL then
    HotKeyText := HotKeyText + 'CTRL+';
  if (HotKeyMod and HOTKEYF_SHIFT) = HOTKEYF_SHIFT then
    HotKeyText := HotKeyText + 'SHIFT+';
  if (HotKeyMod and HOTKEYF_EXT) = HOTKEYF_EXT then
    HotKeyText := HotKeyText + 'Extended+';

  HotKeyText := HotKeyText + Char(Lo(HotKey));

  if (HotKeyText = '') or (HotKeyText = #0) then
    HotKeyText := 'None';

  ShowMessage('Shortcut Key - ' + HotKeyText);
end;

如果你可以访问Safari Books Online,有一个good section about working with shortcuts / shell links在Borland Delphi 6开发指南由史蒂夫Teixeira和Xavier Pacheco。我上面的例子是一个从那里和this site的屠杀版本。

希望有所帮助!

remote – 如何在Windows上使用IPMI?

remote – 如何在Windows上使用IPMI?

我的组织主要是运行 Windows的戴尔商店.大多数是支持 IPMI 2.0的最新型号. (戴尔1950,例如).

至少我想使用IPMI来开启/关闭远程机箱电源,例如当服务器挂起并且NOC上没有人可用来硬启动它时.然后,我想看看它还能做些什么.

配置它并不容易.我试过了ipmiutil工具.我能够查看BMC配置并在某种程度上配置它.我认为我不太了解配置要求,不知道如何启用它.我也知道一个ipmitool工具,但它只能在Unix / Linux上运行.

我想要做的是为服务器操作系统和BMC共享相同的以太网端口,因为它是一个选项,为BMC提供自己的IP.

您可能会想:“戴尔是否拥有可以使用IPMI的DRAC卡?”是的,我们在所有这些中都有DRAC 5卡.配置远程电源管理一直是个谜.

任何方向将不胜感激.

SuperMicro有一个 Java-based IPMIView tool that you might find useful.

根据我的经验,DRAC最容易通过他们的telnet或ssh界面进行管理 – 其他工具往往有点不稳定.

This page是面向Linux的,但提供了对IPMI工具的体面概述.

windows-7 – 如何在Windows7上使用tscon?

windows-7 – 如何在Windows7上使用tscon?

我需要在 Windows7虚拟机上使用rft和IE运行隔夜自动化测试.我发现在测试开始之前重启Windows框有所帮助.

我正在将生产环境从Windows XP迁移到Windows 7.在运行rft脚本时,rft曾经抱怨CRFCN0557E:在终端服务环境下运行时激活失败.这可能是由于使用最小化的终端窗口 – 尝试播放而不会最小化终端窗口(它不需要是全屏).

在启动任何rft脚本之前运行tscon.exe 0 / dest:console会修复Windows XP上的错误.但不是在Windows7上.

我做了一些研究,并试图解决这个问题,但没有任何帮助. Windows7上没有打开屏幕保护程序.

我试着跑两个但没有任何帮助.

tscon.exe 0 /dest:console
tscon.exe 1 /dest:console

在Windows7上tscon返回

{ErrorPrintf(): LoadString Failed,Error 15105,(0x00003B01)}
Error [15105]:The resource loader cache doesn't have loaded MUI entry.
Error [0]:The operation completed successfully.

在Windows XP上tscon返回

Could not connect sessionID 0 to sessionname console,Error code 7045
Error [7045]:The requested session access is denied.

我只是仔细检查了在Windows XP上运行tscon.exe 0 / dest:console解决了这个问题.无法理解tscon命令的输出.

知道如何在我自动重启Windows框后运行rft脚本吗?最好不涉及任何其他计算机.我甚至想使用旧的Windows XP进行远程桌面会话以使rft满意.我希望还有其他更好的解决方案.

在我讨论您的主要问题之前,我想指出您收到消息的事实
{ErrorPrintf(): LoadString Failed,(0x00003B01)}
Error [15105]:The resource loader cache doesn't have loaded MUI entry.

表示系统上的某些内容已损坏. MUI是多语言用户界面.有问题的Windows 7计算机是否设置为使用“英语(美国)”以外的语言?看起来tscon正试图以您配置的语言查找并显示错误消息,但它找不到应该使用的语言文件.这可能是更大问题的症状.您正在使用安装在该计算机上的tscon.exe而不是从另一台计算机上复制的tscon.exe,对吧?

您可以通过在拍摄快照后运行sfc / scanNow并查看tscon是否给出相同的错误来解决此问题.

至于您的主要问题,您提供给tscon的号码表示要处理的会话ID.你有没有检查过你是使用0或1会话?运行查询用户以查看您的会话ID是什么,然后使用该号码.

例如,我从我的一台服务器上的查询用户那里得到了这个输出:

USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  logoN TIME
>starfish              rdp-tcp#4           2  Active          .  9/20/2012 10:12 PM

由于我的会话ID是2,我运行tscon 2 / dest:console将该会话发送到控制台.当我转到控制台并运行查询用户时,我看到以下内容:

USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  logoN TIME
>starfish              console             2  Active          .  9/20/2012 10:12 PM

我还在Windows 7 Pro桌面上对此进行了测试,结果相同.

如果您已成功使用上述命令,则可以将以下内容放入批处理文件中并运行它以将当前会话发送到控制台.

for /f "skip=1 tokens=3 usebackq" %%s in (
  `query user %username%`
) do (
  %windir%\System32\tscon.exe %%s /dest:console
)

它还应该消除重启计算机的需要,我怀疑这是为了确保你总是得到会话ID 0.

可可 – 如何在OS X应用程序中使用Swift监听全局热键?

可可 – 如何在OS X应用程序中使用Swift监听全局热键?

我试图有一个处理程序在我的Mac OS X应用程序中用Swift编写的全局(系统范围)热键组合,但我只是无法找到适当的文档。我读过,我不得不在一些遗留的Carbon API为它,是没有更好的方法?你能给我一些概念证明Swift代码吗?提前致谢!
自从Swift 2.0以来,你现在可以传递一个函数指针到C API。
var gMyHotKeyID = EventHotKeyID()
    gMyHotKeyID.signature = OSType("swat".fourCharCodeValue)
    gMyHotKeyID.id = UInt32(keyCode)

    var eventType = Eventtypespec()
    eventType.eventClass = OSType(kEventClassKeyboard)
    eventType.eventKind = OSType(kEventHotKeypressed)

    // Install handler.
    InstallEventHandler(GetApplicationEventTarget(),{(nextHanlder,theEvent,userData) -> Osstatus in
            var hkCom = EventHotKeyID()
            GetEventParameter(theEvent,EventParamName(kEventParamDirectObject),EventParamType(typeEventHotKeyID),nil,sizeof(EventHotKeyID),&hkCom)

            /// Check that hkCom in indeed your hotkey ID and handle it.
        },1,&eventType,nil)

    // Register hotkey.
    let status = RegisterEventHotKey(UInt32(keyCode),UInt32(modifierKeys),gMyHotKeyID,GetApplicationEventTarget(),&hotKeyRef)

今天关于如何在Windows上使用3个参数创建全局热键?如何在windows上使用3个参数创建全局热键的分享就到这里,希望大家有所收获,若想了解更多关于delphi – 找出哪个进程注册了全局热键? (Windows API)、remote – 如何在Windows上使用IPMI?、windows-7 – 如何在Windows7上使用tscon?、可可 – 如何在OS X应用程序中使用Swift监听全局热键?等相关知识,可以在本站进行查询。

本文标签: