Global hotkeys for specific application with python3 on windows - python-3.x

I'm writing a script to control a specific application with hotkeys. I divided my task into three tasks:
monitor for global keys,
match pressed global hotkeys to keys to be sent,
send keys to specific application.
Let's say i want to send Ctrl+A to Notepad.exe when i press Ctrl+F3 from anywhere. It's important that the application (notepad in this case) i want to control will not be in focus before i press hotkeys and after it.
I suppose task 3 is about to work with pywinauto and it's keyboard.SendKeys. Task 2 is not difficult. But i have no idea how to monitor (in cycle? depending on keyboard events?) for global hotkeys.

Related

using Autohotkey on windows 10 allows window key to open start menu

I've got some AutoHotKey scripts that I use to move windows around my monitors. for example, I have [Shift]+[Win]+[Up] set to move the current window to the monitor above the current one ans size proportionally
My problem is that, since upgrading to windows 10 on Friday, executing one of these functions still performs its hotkey action, but then when I release the Shift key while still holding Window, the start menu opens. When I was still on 7, the start menu would only open if I pressed and released the Window key without pressing any other keys.
I don't have this problem with my hotkeys that use Control+Window instead of Shift. It's only when I press and release the Shift key while holding Window.
How can I fix this?
If your hotkey sends any keys other than LWin/RWin, that should suppress the Start menu. For example, Send {Blind}{vkFF}.
If it fails to suppress the Start menu, that most likely means the Win key is being released (virtually or physically) before you send the key, or released and pressed again after you send the key, and is not being masked correctly. You can troubleshoot this by using KeyHistory, which should show a Win-down immediately followed by a Win-up, and should indicate whether these events were generated by AutoHotkey and with what timing.
The Start menu should appear only if you press and release a Win key while not holding any other modifier keys, and without pressing or releasing any other keys. In other words, what you describe should not be possible unless your hotkey is directly or indirectly releasing Shift and pressing and/or releasing the Win key (and Send is failing to mask it).
Recent versions of AutoHotkey do not mask the Win key when used in hotkeys like +#Up::, because the presence of the Shift key has already masked it.

How to get sublime text 3 to open independent UI instances

I am using sublime text 3 build 3059 in Linux. I open the UI using the command line with -new-window option and point to a file or a directory. I may do this multiple times so several UI instances will be open simultaneously. I would like separate instances of the UI to act independent of each other. Using the --new-window option gets me close but I have found that closing one instance of the UI using ctlr+q / menu->file->quit will close all open UI instances. This is not the case when I close using the X button in the upper right corner which only closes the current instances. This can be painful when there are open instances located in various virtual desktops. Then when you open a file for a quick edit and close it using ctrl+q, all UI instances are closed. This not a good user experience. Does anyone know of an option that would allow me to have ctrl+q close only the current UI instance? My real need is to have the instances to act independently.
BTW, I have found sublime text 2 post that answer this question but sublime text 3 seems to behavior differently in this regard.
The reason for that is that ctrl+q shortcut is the shortcut to exit the application and alt+f4 is the shortcut to close window. This is simply a usability thing and it's somewhat a convention used in may more applications other than Sublime Text.
The ctrl+q shortcut is not mapped in ST settings rather is built-in for Linux version of ST. The OS X version allows remapping this through it's system hotkey settings but not the Linux one.
Thus I suggest simply trying to retrain yourself and use alt+f4 instead.

How to prohibit user to change OS window focus/type keys for several seconds on Linux

I write automated tests for a website. One of the tests needs to press Ctrl+S and type some letters to save a webpage including CSS/JS. The test should require Firefox to have window focus for those several seconds to be able to type the filename and click "Save" (currently XDoTool is used for pressing keys and clicking the mouse).
Sometimes I run the tests on my computer. I don't want to occasionally type something or change the window focus while the page is being saved, so I want to prohibit changing focus for those several seconds when those mouse clicks/key presses are running.
It's not possible to do it at the Webdriver level (a tool that I use for controlling the browser), so I think I should do it at the OS level. Can I prohibit the user from changing window focus or typing anything for a period of time? It may look like:
prohibit user from typing keys/change window focus
save page
allow user to type/change window focus
I guess that another way to achieve the desired effect would be to run Firefox and your automated tests on a nested X server (xf86-video-nested/Xephyr/Xnest).
$ Xnest :1
$ export DISPLAY=:1.0
$ firefox http://something/to/test &
$ your-test-script
Since the nested X server has it's own idea of the focused window, moving the focus on your desktop shouldn't affect it.
(If you don't actually need to see the test progressing, you could use a dummy X server (xf86-video-dummy/Xvfb/Xfake) instead)

Call my application through keyword

My problem is very simple, but implementation can be hard!
I want that my application (Windows Application:: Visual C# .net) is launched whenever the user uses some keys combinations (on his keyboard).
For example it types Ctrl+W+W and my application is launched, that's all, I want the simplest implementation, less code, memory...
Thanks :D
You would need to write a keylogger type application in conjunction with your app which monitors for keyboard events. Once your specific shortcut is triggered you could then load your application.
See here for information on how to capture keystrokes.
Create a shortcut to the application, and assign a hot-key combination to the shortcut. Depending on the O/S, not every keystroke combination can be assigned to a shortcut, e.g. you may be able to assign Ctrl+Alt+W but not Ctrl+W+W.
On Windows, you can create a shortcut (on the desktop) to your application.
When you open the properties of the shortcut, on the second tab (labeled "Shortcut"), you can assign a shortcut key. But you can use only Ctrl+Alt+key shortcuts.
I don't think this is possible in the way that you framed this question. What is possible, however, is to have your application run automatically on startup without showing any forms, have it hook into Windows to monitor all keystrokes (I'm not sure how to do that part, exactly) and then show a form when the user presses a particular sequence of keys.
So in other words, your application would have to be running from the time Windows starts, but only show itself (make a form visible) when the user clicks a particular key sequence.
Update: here is a link to an article that discusses how to do global keystroke capture using C#: http://blogs.msdn.com/toub/archive/2006/05/03/589423.aspx.

How do I make a window move to the top of other windows in Gnome when that window already has the focus?

I have an application that sends the focus to other windows but those windows then don't automatically display themselves in the foreground, i.e. on top of all the other windows. Where can I configure the preferences of my window manager so that this is the default behaviour?
In particular I'm using the Ctrl-0 and Ctrl-Shft-0 shortcuts in the MATLAB IDE to move between the command window and the editor window and although the focus seems to be transferred the new window doesn't automatically redraw itself in the foreground.
Not sure of a key binding off hand that does it, but if you alt-click on a window (which allows you to drag a window) it should come to the front.
As codeDr suggests, MATLAB is also kind of bad about repainting its windows. If you draw to a figure while code is executing, the figure does not update unless you execute drawnow or have some similar pause in the execution to allow the GUI to repaint. Since we're talking about MATLAB, the figure command will also cause the indicated figure to come to the front (in fact, it's harder to get it to not come to the front). So you could do figure(gcf) to bring the current figure to the front, or save the figure number with h = figure; and then later do figure(h). Incidentally, if you want to switch current figures without switching focus, set(0, 'CurrentFigure', h) should set h to the current figure.
Your window manager (probably Metacity?) implements focus-stealing prevention so that rogue apps don't pop up windows that would disturb your typing. Matlab needs to raise its window, and give it the input focus with the correct timestamp. If this is being done from a KeyPress event handler, the timestamp for setting the input focus would be the timestamp from the KeyPress event (i.e. the timestamp of the user-generated event that caused a window to be raised/focused).
To politely give the input focus to a window, google for _NET_ACTIVE_WINDOW.
Usually when the window doesn't repaint, it means that the application's main application loop isn't running to refresh the window. Could it be that Matlab is doing some computation or disk activity when you are switching between windows?

Resources